migrer un serveur

sur le nouveau serveur :
cat .ssh/id_rsa.pub
à mettre sur l'ancien serveur pour pouvoir Rsync depuis le nouveau serveur à partir de l'ancien :
emacs .ssh/authorized_keys

Prendre les lignes qui manquent depuis l'ancien server :
emacs /etc/passwd.
Faire attention au doublons Netdata/redis/mango/… et aux ids.
sur le nouveau serveur, pour chaque user on retire le mot de passe :
passwd -d user

Synchro depuis le nouveau serveur :
rsync -aqzP -e "ssh -p 22" --exclude app/logs --exclude app/cache root@ancien_serv:/home/ /home/

Copier les bases :
Sur les 2 serveurs :
service mysql stop;
Sur le nouveau :
rsync -aqzP -e "ssh -p 22" root@ancien_serv:/var/lib/mysql/ /var/lib/mysql/
service mysql start;

Copier les letsencrypt :
Sur le nouveau serveur :
rsync -aqzP -e "ssh -p 22" root@ancien_serv:/etc/letsencrypt/ /etc/letsencrypt/

Copier Apache :
Sur l'ancien serveur :
apachectl stop
sur le nouveau serveur :
rsync -aqzP -e "ssh -p 22" root@ancien_serv:/etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/000-default.conf
apachectl restart

Copier les script :
mkdir /root/log/
rsync -aqzP -e "ssh -p 22" root@ancien_serv:/root/scripts/ /root/scripts/

Copier le hosts :
emacs /etc/hosts, migrer les host et nettoyer l'ancien.

Ajouter un serveur sur backup :
Mettre la clef de backup sur le nouveau serveur. Dupliquer les crons root sur le serveur backup.

Copier l'ensemble des crons :
rsync -aqzP -e "ssh -p 22" root@ancien_serv:/var/spool/cron/crontabs/ /var/spool/cron/crontabs/

Changer les DNS

Vérifier que le serveur de backup pompe bien le nouveau serveur

Croiser les doigts

imagemagick

apt-get install imagemagick

# gérer le bug sur certains docs
In file /etc/ImageMagick-6/policy.xml (or /etc/ImageMagick/policy.xml)
1) comment line

2) change line to

3) add line Then restart your web server (nginx, apache).

#installation custom
apt-get install libjpeg libjpeg-dev
wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
tar xvfz ImageMagick.tar.gz
cd ImageMagick-*
./configure
make
make install
ldconfig /usr/local/lib
identify -version
make check

postfix relay to mailjet

apt install mailutils
=> selectionner l'option pas de config

emacs /etc/postfix/main.cf
(normalement il existe pas. donc il faut le créer)
relayhost = in-v3.mailjet.com
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
compatibility_level = 2

emacs /etc/postfix/sasl_passwd
in-v3.mailjet.com VOTRE_CLE_API:VOTRE_CLE_SECRETE

chown root:root /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
postfix reload

Pour faire un mail de test :
echo salut | mail -s subject martin.wb.2015@gmail.com -a 'From: contact@smsmachine.fr'

Penser à autoriser l'email contact@smsmachine.fr sur mailjet.

migrer site

# Si ya du https créer de nouvelles cles letsencrypt sur le nouveau serveur : (ne jamais copier les fichiers letsencrypt, ca merde partout)
# erreurs typiques : conf file broken / archive exists =>
rm -rf /etc/letsencrypt/archive/project
rm -rf /etc/letsencrypt/live/project
rm -rf /etc/letsencrypt/renewal/project.conf

#Prendre les vhosts et les mettre sur le nouveau serveur
/etc/apache2/sites-enabled/000-default.conf
#le virer du premier
# si nodejs, verifier qu'on utilise pas le même port qu'un projet existant

apachectl restart

#réparer le renouvellement de letsencrypt sur l'ancien serveur et sur le nouveau serveur :
/root/scripts/letsencrypt.sh

# donner l'accès au nouveau serveur depuis l'ancien serveur
# vieux serveur :
cat /root/.ssh/id_rsa.pub
# nouveau serveur
emacs /root/.ssh/authorized_keys

#copier le code: (/ final important)
#les clés ssh seront automatiquement écrasées
rsync -avzP /home/projet_prod/ root@newserver:/home/projet_prod/

# créer user sur le nouveau serveur
useradd -m -s /bin/bash -d /home/projet_prod projet_prod
chown -R projet_prod:projet_prod /home/projet_prod

# changer l'adresse du .git si nécessaire
# ancien serveur si on le conserve
# sur le git du pc local si le nom de domaine change
emacs .git/config
git pull

# copier tous les crons vers le nouveau serveur
#ancien serveur:
crontab -l
#nouveau serveur :
crontab -e

# ajouter le nom de domaine dans hosts
/etc/hosts

# copier la base de donnée

# adapter la config
#si c'est un nodejs mettre le bon numéro de port dans config.js
emacs config.js

# demarrer le serveur

# Supprimer user ancien serveur
killall -u projet_prod
userdel -f -r projet_prod

screen

lancer un screen :
screen

vous pouvez fermer le terminal ou perdre votre connexion sans pb.

lister les sessions
screen -ls

se reconnecter a la sesion crée
screen -r

créer une session si elle n'existe pas, la nomme, et s'y connecte.
si existe déjà, s'y connecte. La detache de l'ancien terminal si besoin.
screen -DR

apache server status

Pour activer le module (il est normalement activé par défaut)
2enmod status

Puis ouvrir la conf :
emacs /etc/apache2/mods-enabled/status.conf

Autoriser une ips en particulier :

SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.1.16

Ou autoriser un groupe d'ip :

SetHandler server-status
require ip 192.168.1.0/24

Autoriser tout le monde :

SetHandler server-status
Order deny,allow
Allow from all

Autoriser par mot de passe :
AuthName "Safe Zone"
AuthType Basic
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
puis dans la console :
htpasswd -cb /etc/apache2/.htpasswd user password

reboot apache :
apachectl restart

Pour voir la page :
http://NomDuServeur/server-status

Si ça marche pas (un des autres sites hébergé sur le serveur affiche page introuvable)
Vérifier qu'il n'y a au moins un vhost propre sans redirection (quitte à en ajouter un fake en premier dans le fichier apache) :
emacs /etc/apache2/sites-enabled/000-default.conf

ServerName fake

sécurity

# node security
> npm install -g nsp
> nsp check

> npm install -g snyk
> snyk test

# dependency check
http://jeremylong.github.io/DependencyCheck/dependency-check-cli/installation.html
> ./dependency-check.sh -s /z/web/vitrine/ --project vitrine

#sonarqube
https://www.sonarqube.org/features/multi-languages/
télécharger sonarqube et le mettre la : C:\Users\raf\Downloads\programmes\securite\sonarqube-7.0\
télécharger sonarscanner et le mettre dedans, par exemple : C:\Users\raf\Downloads\programmes\securite\sonarqube-7.0\sonar-scanner-3.1.0.1141-windows\
mettre ça dans le path : C:\Users\raf\Downloads\programmes\securite\sonarqube-7.0\sonar-scanner-3.1.0.1141-windows\bin

lancer le serveur :
> C:\Users\raf\Downloads\programmes\securite\sonarqube-7.0\bin\windows-x86-64\StartSonar.bat
et mettre ça dans le navigateur : http://localhost:9000
créer un projet via les menus.

lancer le scanner :
> emacs sonar-project.properties
# must be unique in a given SonarQube instance
sonar.projectKey=gextra
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=gextra
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8

> sonar-scanner

vhost


ServerName palhostellisboa.pt
ServerAlias www.palhostellisboa.pt

RewriteEngine on

# enlever le www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
# ajouter le www
RewriteCond %{HTTP_HOST} ^palhostellisboa.pt$
RewriteRule ^(.*) https://www.palhostellisboa.pt/$1 [QSA,L,R=301]

# si projet en PHP => a delete toujours
AssignUserId vasoignants_prod vasoignants_prod
DocumentRoot /home/vasoignants_prod/site/web

RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]



ServerName palhostellisboa.pt
ServerAlias www.palhostellisboa.pt

RewriteEngine on

# enlever le www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
# ajouter le www
RewriteCond %{HTTP_HOST} ^palhostellisboa.pt$
RewriteRule ^(.*) https://www.palhostellisboa.pt/$1 [QSA,L,R=301]

SSLCipherSuite HIGH:!aNULL:!MD5:!ADH:!RC4:!DH
SSLHonorCipherOrder on
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/www.palhostellisboa.pt/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www.palhostellisboa.pt/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/www.palhostellisboa.pt/chain.pem"

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

# si projet en PHP
AssignUserId reservation_prod reservation_prod
DocumentRoot /home/reservation_prod/site/web

# si projet en NODEJS
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:4000/$1 [P,L]

ProxyRequests Off
ProxyPass / http://localhost:4000/
ProxyPassReverse / http://localhost:4000/
ProxyPreserveHost On

clean git

situation initiale :
--------------------
sur le serveur
git init --bare projet

sur le client
git clone root@2i.raphaelpiccolo.com:/root/projet projet
git clone root@2i.raphaelpiccolo.com:/root/projet projet2
git clone root@2i.raphaelpiccolo.com:/root/projet projet3

chacun des dossier projet* font environ 50ko

ajouter des fichiers de merde sur le 1er client
cd projet
git add v.mp4
git commit -m projet
git push

projet fait maintenant 70mo.

on peut puller sur le 2e git
cd projet2
git pull
projet2 fait maintenant 70mo aussi.

lancer le nettoyage sur un des clients :
----------------------------------------
cd projet
git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch *.mp4' --prune-empty -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now

projet fait maintenant 50ko.

envoyer sur le serveur et aux autres developpeurs :
---------------------------------------------------
cd projet
git push origin master --force

puller sur l'autre client
cd projet2
git pull
le dossier n'a réduit de taille qu'a moitié. (35mo) car la video est toujours dans l'archive git locale mais plus dans le dossier.
il faut relancer les commandes de nettoyage :
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
projet2 fait maintenant 50ko.

par contre sur projet3 la video n'avait pas encore été pullée
cd projet3
git pull
projet3 fait maintenant 50ko.

une autre technique est de cloner le repo une fois le 1er clean effectué, mais attention à bien backup et remettre tous les fichiers non gérés par git : config, uploads, etc
rm -rf projet2
git clone root@2i.raphaelpiccolo.com:/root/projet projet2

redis

get databases :
redis-cli INFO | grep ^db

get keys
KEYS *
keys *pattern*

get <key>
set <key> <value>
setnx <key> <value> # Set key value only if key does not exist

choisi une base
select 1

Global WordPress

Ajouter un super admin en sql :

INSERT INTO `databasename`.`wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_activation_key`, `user_status`, `display_name`) VALUES ('4', 'demo', MD5('demo'), 'Your Name', 'test@yourdomain.com', 'http://www.test.com/', '2011-06-07 00:00:00', '', '0', 'Your Name');
INSERT INTO `databasename`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '4', 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
INSERT INTO `databasename`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '4', 'wp_user_level', '10');

 

react native

INSTALLATION
sur windows : yarn
sur apple : brew install watchman

Dans les 2 cas :
npm install -g react-native
npm install -g react-native-cli
npm install -g react-devtools

Pour apple : xcode / preference / locations / comamnd line tools > newest

pour windows :
androidstudio
lancer android studio
télécharger le sdk (en particulier la dernière version)
télécharger platform tools
télécharger tools

PATH: (ajouter cette ligne)
C:\Androidsdk\platform-tools

ANDROID_HOME
C:\Androidsdk\

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JAVA_HOME
C:\Program Files\Java\jdk1.8.0_11

pour créer un projet
react-native init AwesomeProject
npm install --save react-navigation
npm install --save react-native-vector-icons
npm install --save native-base
npm install --save react-native-calendars
npm install --save react-native-multiple-select
npm install --save react-native-datepicker

LANCER ANDROID
react-native run-android

Si probleme

android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
}

SI problème, lancer une première fois le projet avec android studio et compiler, ça installera ce qu'il manque.
et créer un virtual device si necessaire

Si autre probleme
lancer a la main le bundler :
react-native start -- -reset-cache

Si tout merde
rm node_modules\react-native\local-cli\core\__fixtures__\files\package.json
cd android && ./gradlew clean
rm -rf node_modules && npm install

pour debuger via adb (permet de voir les causes de plantage des version release par exemple)
adb logcat *:E

LANCER IOS
react-native run-ios

emacs ios/gextrareact/Info.plist
(ajouter ou modifier si ça existe ! en général il y a une règle localhost)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

RENAME PROJECT ID ANDROID
I've changed project' subfolder name from: "android/app/src/main/java/MY/APP/OLD_ID/" to: "android/app/src/main/java/MY/APP/NEW_ID/"

Then manually switched the old and new package ids:
In: android/app/src/main/java/MY/APP/NEW_ID/MainActivity.java:
package MY.APP.NEW_ID;

In android/app/src/main/java/MY/APP/NEW_ID/MainApplication.java:
package MY.APP.NEW_ID;

In android/app/src/main/AndroidManifest.xml:
package="MY.APP.NEW_ID"

In android/app/BUCK:
android_build_config(
package="MY.APP.NEW_ID"
)
android_resource(
package="MY.APP.NEW_ID"
)

And in android/app/build.gradle:
applicationId "MY.APP.NEW_ID"

Gradle' cleaning in the end (in /android folder):
./gradlew clean

RENAME PROJECT NAME ANDROID

In package.json
"name" : "gextranet",

In index.js
AppRegistry.registerComponent('gextranet', () => App);

In app.json
{
"name": "gextranet",
"displayName": "gextranet"
}

In android/settings.graddle
rootProject.name = 'gextranet'

In android/app/src/main/java/net/gextra/app/MainActivity
protected String getMainComponentName() {
return "gextranet";
}

In android/app/src/main/res/values/strings.xml
gextranet

RENAME PROJECT IOS
rm -rf ios
react-native upgrade
ou
react-native eject
puis vérifier ce qu'il s'est passé avec git
et récupérer les bouts de code manquant.

CHANGE VERSION ANDROID
android/app/build.gradle
android {
defaultConfig {
versionCode 1
versionName "1.0"
{...}
}
{...}
}

CHANGE TARGET SDK ANDROID
emacs android/app/build.gradle
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
minSdkVersion 16
targetSdkVersion 27
}
dependencies {
compile "com.android.support:appcompat-v7:27.1.1"
}

emacs android/build.gradle
allprojects {
repositories {
maven {
url 'https://maven.google.com'
}
}
}

CHANGER APP ICON ANDROID
Upload your image to Android Asset Studio ( http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html ).
download zip
extract to /android/app/src/main/res/ folder.
Make sure to put each image in the right subfolder mipmap-{hdpi, mdpi, xhdpi, xxhdpi, xxxhdpi}.

CHANGER APP ICON ios
https://makeappicon.com/
remplacer le dossier avec ce que le site fourni

RELEASE ANDROID
# la première fois :
cd android/app && keytool -genkey -v -keystore gextrareact.keystore -alias gextrareact -keyalg RSA -keysize 2048 -validity 10000

emacs android/gradle.properties
MYAPP_RELEASE_STORE_FILE=gextrareact.keystore
MYAPP_RELEASE_KEY_ALIAS=gextrareact
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

emacs android/app/build.gradle
...
android {
...
defaultConfig { ... }
signingConfigs {
release {
if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
...

# à chaque fois que l'on veut remettre sur le store :
cd android && ./gradlew assembleRelease
ca cree un fichier ici : android/app/build/outputs/apk/app-release.apk

react-native run-android --variant=release

tester manuellement :
adb devices
adb -s [device] install example.apk
adb -s 9885e64d5131533535 install android/app/build/outputs/apk/app-release.apk

BUG COMPILATION ANDROID : force sdk version on subprojects
error: failed linking references.

emacs android/build.graddle
subprojects {
afterEvaluate {project ->
if (project.hasProperty("android")) {
android {
compileSdkVersion 28
buildToolsVersion '28.0.0'
}
}
}
}

RELEASE IOS
utiliser le flux normal de publication :
https://www.supinfo.com/articles/single/6726-publication-une-application-ios-app-store-debut-2018-partie-1
https://www.supinfo.com/articles/single/6953-publication-une-application-ios-store-debut-2018-partie-2

xcode
selectionner "generic ios device"
product / archive / upload

si l'upload n'est pas possible on peut finaliser via "application loader"

geocoding google map

Aller sur : https://developers.google.com/maps/documentation/geocoding/get-api-key?hl=fr
cliquer sur "obtenir une cle"
choisir le projet ou le créer
la popup vous donne une cle a mettre dans config.js :

googlemap: {
key: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
}

Pour gérer projets/cle/droits c'est ici :
https://console.cloud.google.com/iam-admin/settings/project?project=ideaz-1505118002116&hl=fr

Nouveau projet : user + git + ssh

useradd -m -s /bin/bash -d /home/center_git center_git
useradd -m -s /bin/bash -d /home/center_prod center_prod

su -l center_git -c "ssh-keygen -q -t rsa -N '' -f /home/center_git/.ssh/id_rsa"
su -l center_prod -c "ssh-keygen -q -t rsa -N '' -f /home/center_prod/.ssh/id_rsa"

echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoBrnflaoJfcCETItWRL2TpFi4Fi3V1SzZxu7yLpuyR5RgTqp64HEAQJqTPxgD7vQpGAETjBByk7+8TyIQnFiWhWp30Gi9w6pxcfHpOR1PtwyyeTsKY7NiEl3zatA9fn2tNKOO0U6GsNIwvVTdyPDTltGpGsTnRSbvKtuCr+ok5Ns5iicgu2+Icqxavte0XM8GV9+V8v+XhmVJaGpkCUMwwzidw0cKc1BpZwDlOwZw7KMQ6BJVEdloBeyHjQm3QIxuMoqrhy+xeJeboc/4HDbnvlrLNs95EZAoEyNhm5oNsS0ujFkWbHB7Zrc/qdHre/fIPIIshPEB85myyXyLnOtkw== rsa-key-20120215-raf" >> /home/center_git/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAh3lDPLIg3/cjLOTsFC7S4Day5H4VkA2dBTb/LrsmPOb5/NJhSyq703p4kKM7mkzvB4gRJ0/YpH4iVbD9H39nDYOQqSokB9QfLyrRp0bgZqtt5R+jZ/YUPnu852yn+BLn1pn9+cn+ycuq9K35rbsXn9k7gVoG4AanwW/IeK8jGgU= rsa-key-20161116-martin" >> /home/center_git/.ssh/authorized_keys

echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoBrnflaoJfcCETItWRL2TpFi4Fi3V1SzZxu7yLpuyR5RgTqp64HEAQJqTPxgD7vQpGAETjBByk7+8TyIQnFiWhWp30Gi9w6pxcfHpOR1PtwyyeTsKY7NiEl3zatA9fn2tNKOO0U6GsNIwvVTdyPDTltGpGsTnRSbvKtuCr+ok5Ns5iicgu2+Icqxavte0XM8GV9+V8v+XhmVJaGpkCUMwwzidw0cKc1BpZwDlOwZw7KMQ6BJVEdloBeyHjQm3QIxuMoqrhy+xeJeboc/4HDbnvlrLNs95EZAoEyNhm5oNsS0ujFkWbHB7Zrc/qdHre/fIPIIshPEB85myyXyLnOtkw== rsa-key-20120215-raf" >> /home/center_prod/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAh3lDPLIg3/cjLOTsFC7S4Day5H4VkA2dBTb/LrsmPOb5/NJhSyq703p4kKM7mkzvB4gRJ0/YpH4iVbD9H39nDYOQqSokB9QfLyrRp0bgZqtt5R+jZ/YUPnu852yn+BLn1pn9+cn+ycuq9K35rbsXn9k7gVoG4AanwW/IeK8jGgU= rsa-key-20161116-martin" >> /home/center_prod/.ssh/authorized_keys

echo 'center_git:XXXXXX' | chpasswd
echo 'center_prod:XXXXXX' | chpasswd

cat /home/center_prod/.ssh/id_rsa.pub >> /home/center_git/.ssh/authorized_keys

mkdir /home/center_git/git
git init --bare /home/center_git/git
chown -R center_git:center_git /home/center_git

su center_prod
mkdir /home/center_prod/site
cd
ssh-keyscan localhost >> /home/center_prod/.ssh/known_hosts
git clone center_git@localhost:/home/center_git/git /home/center_prod/site
git config --global user.email "rafi.piccolo@gmail.com"
git config --global user.name "prod"
git config --global push.default simple
exit
chown -R center_prod:center_prod /home/center_prod
chmod -R go-rwx /home/center_git;
chmod -R go-rwx /home/center_prod;

RENAME PROJECT
killall -u hopital_git
killall -u hopital_prod
usermod -l center_git hopital_git
usermod -l center_prod hopital_prod
emacs /etc/passwd
emacs /etc/group
mv /home/hopital_git /home/center_git
mv /home/hopital_prod /home/center_prod
chown -R center_git:center_git /home/center_git
chown -R center_prod:center_prod /home/center_prod
su center_prod
cd
cd site
emacs .git/config
git pull
exit
mv /var/spool/cron/crontabs/hopital_prod /var/spool/cron/crontabs/center_prod
emacs /var/spool/cron/crontabs/center_prod
emacs /etc/apache2/sites-enabled/000-default.conf
emacs /home/center_git/.ssh/authorized_keys
emacs /home/center_git/.ssh/id_rsa.pub
emacs /home/center_prod/.ssh/authorized_keys
emacs /home/center_prod/.ssh/id_rsa.pub

DELETE PROJECT
killall -u ooredoo_prod
userdel -f -r ooredoo_prod
emacs /etc/apache2/sites-enabled/000-default.conf

lets encrypt https vhost apache

apt-get install letsencrypt
apt-get install python-letsencrypt-apache

Pour créer ou renew :
letsencrypt certonly --manual --renew-by-default --email admin@site.fr -d site.fr
This creates a directory: /etc/letsencrypt/live/example.com/ containing certificate files:
cert.pem
chain.pem
fullchain.pem
privkey.pem

Pour renew automatique (cron) :
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 0 1 * * ( /usr/sbin/apachectl stop && /usr/bin/letsencrypt certonly --renew-by-default --email contact@ideaz.world -d ideaz.world ; /usr/sbin/apachectl restart ) > /root/letsencryptideaz.log.txt 2>&1

Pour copier un dossier letsencrypt depuis un autre serveur :
rsync -avz -e ssh root@xx.yyyy.com:/etc/letsencrypt/ /etc/letsencrypt/

exemple complet vhost apache :

<VirtualHost *:80>
ServerName law.raphaelpiccolo.com
ServerAlias ordalis.fr
ServerAlias www.ordalis.fr
RewriteEngine on
RewriteRule ^/(.*) https://ordalis.fr/$1 [L,R]
</VirtualHost>

<VirtualHost *:443>
ServerName law.raphaelpiccolo.com
ServerAlias ordalis.fr
ServerAlias www.ordalis.fr

SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/ordalis.fr/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/ordalis.fr/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/ordalis.fr/chain.pem"

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:10000/$1 [P,L]

RewriteCond %{HTTP_HOST} ^www\.(.+)$
RewriteRule ^(.*) https://$1 [QSA,L,R=301]

ProxyRequests Off
ProxyPass / http://localhost:10000/
ProxyPassReverse / http://localhost:10000/
ProxyPreserveHost On
</VirtualHost>

Si ça merde :
find /etc/letsencrypt | grep projet | xargs rm -rf
et retenter.

INSTALLER UN NOUVEAU SITE AVEC APACHE ET NODEJS

in your vhost add

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:10000/$1 [P,L]

ProxyRequests Off
ProxyPass / http://localhost:8000/
ProxyPassReverse / http://localhost:8000/
ProxyPreserveHost On
</VirtualHost>

check theses modules
a2enmod proxy
a2enmod proxy_wstunnel
a2enmod proxy_http

exemple nodejs app :
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');

pour mettre letsencrypt : http://blog.raphaelpiccolo.com/?p=409

pour mettre un https de qualite max : http://blog.raphaelpiccolo.com/?p=19

installation serveur : apache SUEXEC

apt-get install apache2-suexec-custom libapache2-mod-fcgid php5-cgi
a2enmod fcgid
a2enmod suexec
a2enmod alias
a2enmod actions
a2enmod rewrite
a2enmod authz_groupfile
a2dismod php5

emacs /etc/apache2/apache2.conf
replacer
par
et mettre AllowOverride All

emacs /etc/apache2/suexec/www-data
and set :
/home
site

emacs /etc/apache2/conf-available/php5-fcgid.conf
AddType application/x-httpd-php .php
AddHandler php-fcgi .php
Action php-fcgi /fcgi-bin/php5-fcgi
Alias /fcgi-bin/ /home/www-data/

SetHandler fcgid-script
Options +ExecCGI

FcgidMaxRequestLen 700000000 # for long uploads
FcgidBusyTimeout 36000 # for long downloads
FcgidIOTimeout 600 # blablabla

a2enconf php5-fcgid

mkdir /home/www-data
emacs /home/www-data/php5-fcgi
#!/bin/sh
exec /usr/bin/php5-cgi

chmod +x /home/www-data/php5-fcgi
chown -R www-data:www-data /home/www-data

vhost default:

DocumentRoot /home/www-data/site

FcgidIOTimeout

INSTALLER UN NOUVEAU SITE AVEC SUEXEC

useradd --home=/home/example example -m -U -s /bin/bash
mkdir /home/www-data/example/
cp /home/www-data/php5-fcgi /home/www-data/example/php5-fcgi
chown -R example:example /home/www-data/example
chown -R example:example /home/example

ajouter un vhost

ServerName example.com

Alias /fcgi-bin/ /home/www-data/example/
SuexecUserGroup example example
DocumentRoot /home/example/site/

Tester le script :
emacs /home/example/site/index.php

=> doit renvoyer example

installation serveur : APACHE PHP FPM

a2enmod actions
apt-get install php7.0-fpm
apt-get install libapache2-mod-fastcgi
emacs /etc/php/7.0/fpm/php.ini
display_errors=On

apache2ctl -V
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jan 14 2016 17:45:23
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)

créer plusieurs /etc/php7.0/fpm/pool.d/ (1 par site)

exemple :
emacs /etc/php/7.0/fpm/pool.d/valerietoiles_dev.conf
[valerietoiles_dev]
user = valerietoiles_dev
group = valerietoiles_dev
listen = /run/php/php7.0-fpm.valerietoiles_dev.sock
listen.owner = valerietoiles_dev
listen.group = valerietoiles_dev
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

créer un fichier qui lancera les fichiers php :
emacs /usr/lib/cgi-bin/php7-fcgi.valerietoiles_dev
#!/bin/sh
exec /opt/php52/bin/php-cgi

s'assurer qu'il a les bons droits
chown valerietoiles_dev:valerietoiles_dev /usr/lib/cgi-bin/php7-fcgi.valerietoiles_dev;

service php7.0-fpm restart

dans le vhost mettre

ServerName valerietoiles_dev.com
DocumentRoot /home/valerietoiles_dev/site/

AddHandler php7.0-fcgi.valerietoiles_dev .php
Action php7.0-fcgi.valerietoiles_dev /php7.0-fcgi.valerietoiles_dev
Alias /php7.0-fcgi.valerietoiles_dev /usr/lib/cgi-bin/php7.0-fcgi.valerietoiles_dev
FastCgiExternalServer /usr/lib/cgi-bin/php7.0-fcgi.valerietoiles_dev -socket /var/run/php7.0-fpm.valerietoiles_dev.sock -pass-header Authorization


Require all granted

PS:
vérifier que chaque vhost a une socket fpm différente
www-data doit avoir accès a tous les fichirs statiques et aux fichiers .htaccess et php.

installation serveur : APACHE ITK

execute a vhost with a user's account instead of apache account

apt-get install libapache2-mpm-itk php7.0 libapache2-mod-php7.0
a2enmod alias
a2enmod actions
a2enmod rewrite
a2enmod authz_groupfile
a2enmod ssl
service apache2 restart

emacs /etc/apache2/apache2.conf
add %D somewhere
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" vhost_combined

apachectl restart

apachectl -V
Server version: Apache/2.4.7 (Ubuntu)
Server built: Mar 10 2015 13:05:59
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)

CREER UN NOUVEAU PROJET
useradd --home=/home/example example -m -U -s /bin/bash

add a vhost :
just add AssignUserId (it seems to be ignored. the effective user launching the file is the owner of the file)


ServerName example.com
AssignUserId example example
DocumentRoot /home/example/site/

check rights :
emacs /etc/apache2/apache2.conf
replace
with
and add
AllowOverride All
Require all granted

chown -R example:example /home/example
chmod -R 700 /home/example

you can test it with :
emacs index.php

installation serveur : MySQL

killall mysqld
rm -rf /var/lib/mysql
apt-get remove --purge mysql-server mysql-client mysql-common
apt-get autoremove
apt-get autoclean
apt-get install mysql-server mysql-client

# rendre accessible de l'extérieur
emacs /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0

mysql -u root -pxxxxx
RENAME USER 'root'@'localhost' TO 'root'@'%';
FLUSH PRIVILEGES;

service mysql restart

my.ini
max_allowed_packet = 16M
sort_buffer_size = 256K

# mysqladmin -u root password "new password"

installation serveur : RUTORRENT

mkdir /home/rtorrent

apt-get update
apt-get install subversion build-essential automake libtool libcppunit-dev libcurl3-dev libsigc++-2.0-dev unzip unrar-free curl libncurses-dev
apt-get install apache2 php5 php5-cli php5-curl
apt-get install libapache2-mod-scgi
apt-get install xmlrpc-api-utils rtorrent
apt-get install libxmlrpc-core-c3-dev

a2enmod ssl auth_digest scgi

upload rutorrent pack to /home/rtorrent/site
chown -R raf:raf /home/rtorrent

check this line in .rtorrent.rc
scgi_port = 127.0.0.1:5000

allow distant access : add in apache
SCGIMount /RPC2 127.0.0.1:5000

AuthType Basic
AuthName "Rtorrent"
AssignUserId www-data www-data
AuthUserFile /home/www-data/.rtorrent-htpasswd
Require valid-user

MCRYPT (fix pour ubuntu 13.10)

sudo ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available
sudo php5enmod mcrypt
sudo service apache2 restart

installation serveur : SQUID

apt-get install squid

mode autoriser ip:
emacs /etc/squid/squid.conf
Pour autoriser une ip, avant cette ligne : http_access deny all
mettre :
acl allowed_ips src 82.224.239.198
http_access allow allowed_ips

mode accès user:
htpasswd -cb /etc/squid/htpasswd raf XXXXXX
chmod o+r /etc/squid/htpasswd

emacs /etc/squid/squid.conf
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/htpass\
wd
auth_param basic children 5 startup=5 idle=1
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users

service squid restart

anonyme :
forwarded_for = delete
request_header_access Allow allow all
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access User-Agent allow all
request_header_access Cookie allow all
request_header_access All deny all

# PROXY.PAC
emacs .htaccess
AddType application/x-ns-proxy-autoconfig pac

emacs proxy.pac
function FindProxyForURL(url, host) {
if ((shExpMatch(host, "localhost")) ||
(shExpMatch(host, "*.local")) ||
(host == "127.0.0.1")) {
return "DIRECT";
}

if (isInNet(host, "127.0.0.1", "255.255.255.0"))
{
return "DIRECT";
}

return "PROXY 46.105.126.96:3128";
}

installation serveur : MAIL (mode local avec redirections)

doc source : http://flurdy.com/docs/postfix/

apt-get update
apt-get upgrade
install mysql-client mysql-server

créer un user et sa bdd "mail"

créer les tables suivantes :
CREATE TABLE `aliases` (
`pkid` smallint(3) NOT NULL auto_increment,
`mail` varchar(120) NOT NULL default '',
`destination` varchar(120) NOT NULL default '',
`enabled` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`pkid`),
UNIQUE KEY `mail` (`mail`)
) ;
CREATE TABLE `domains` (
`pkid` smallint(6) NOT NULL auto_increment,
`domain` varchar(120) NOT NULL default '',
`transport` varchar(120) NOT NULL default 'virtual:',
`enabled` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`pkid`)
) ;
CREATE TABLE `users` (
`id` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`uid` smallint(5) unsigned NOT NULL default '5000',
`gid` smallint(5) unsigned NOT NULL default '5000',
`home` varchar(255) NOT NULL default '/var/spool/mail/virtual',
`maildir` varchar(255) NOT NULL default 'blah/',
`enabled` tinyint(3) unsigned NOT NULL default '1',
`change_password` tinyint(3) unsigned NOT NULL default '1',
`clear` varchar(128) NOT NULL default 'ChangeMe',
`crypt` varchar(128) NOT NULL default 'sdtrusfX0Jj66',
`quota` varchar(255) NOT NULL default '',
`procmailrc` varchar(128) NOT NULL default '',
`spamassassinrc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ;

INSERT INTO domains (domain) VALUES
('localhost'),
('localhost.localdomain');
INSERT INTO aliases (mail,destination) VALUES
('postmaster@localhost','root@localhost'),
('sysadmin@localhost','root@localhost'),
('webmaster@localhost','root@localhost'),
('abuse@localhost','root@localhost'),
('root@localhost','root@rafi.piccolo@gmail.com'),
('@localhost','root@localhost'),
('@localhost.localdomain','@localhost');
INSERT INTO users (id,name,maildir,crypt) VALUES
('root@localhost','root','root/',encrypt('apassword', CONCAT('$5$', MD5(RAND()))) );

apt-get install postfix postfix-mysql
=> mode internet site

emacs /etc/mailname
emacs /etc/postfix/main.cf
myorigin=/etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name
relayhost =
inet_interfaces = all
mynetworks_style = host
# masquerade_domains = mail.example.com www.example.com !sub.dyndomain.com
# masquerade_exceptions = root
local_recipient_maps =
mydestination =
Then will set a few numbers.
delay_warning_time = 4h
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
smtp_helo_timeout = 60s
smtpd_recipient_limit = 16
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
smtpd_sender_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, permit
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_helo_required = yes
smtpd_delay_reject = yes
disable_vrfy_command = yes
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
# transport_maps = mysql:/etc/postfix/mysql_transport.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

cp /etc/aliases /etc/postfix/aliases
postalias /etc/postfix/aliases

mkdir /var/spool/mail/virtual
groupadd --system virtual -g 5000
useradd --system virtual -u 5000 -g 5000
chown -R virtual:virtual /var/spool/mail/virtual

emacs /etc/postfix/mysql_mailbox.cf
user=mail
password=XXXXXX
dbname=mail
table=users
select_field=maildir
where_field=id
hosts=127.0.0.1
additional_conditions = and enabled = 1

emacs /etc/postfix/mysql_alias.cf
user=mail
password=XXXXXX
dbname=mail
table=aliases
select_field=destination
where_field=mail
hosts=127.0.0.1
additional_conditions = and enabled = 1

emacs /etc/postfix/mysql_domains.cf
user=mail
password=XXXXXX
dbname=mail
table=domains
select_field=domain
where_field=domain
hosts=127.0.0.1
additional_conditions = and enabled = 1

apt-get install courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-imap-ssl courier-ssl
=> no webdirectories

emacs /etc/courier/authdaemonrc
authmodulelist="authmysql"
DEBUG_LOGIN=2

emacs /etc/courier/authmysqlrc
MYSQL_USERNAME mail
MYSQL_PASSWORD XXXXXX
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
# MYSQL_CLEAR_PWFIELD clear
MYSQL_MAILDIR_FIELD concat(home,'/',maildir)
MYSQL_WHERE_CLAUSE enabled=1

/etc/init.d/postfix restart

apt-get install mailutils

tester avec : mail email@email.com
vérifier les logs : tail -f /var/log/mail.log

installation serveur : MAIL (mode relay smtp vers 1&1)

utiliser basiquement la même conf qu'un outlook

sudo apt-get install postfix sasl2-bin libsasl2-2 libsasl2-modules

emacs /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

delay_warning_time = 2h
bounce_notice_recipient = postfix-errors@yourdomain.com
delay_notice_recipient = postfix-errors@yourdomain.com
error_notice_recipient = postfix-errors@yourdomain.com

readme_directory = no

myhostname = yourdomain.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = yourdomain.com
myorigin = $mydomain
mydestination =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = 127.0.0.1
inet_protocols = ipv4

# SSL parameters - these are used when sending mail via 1and1 to ensure the connection's secure.
smtp_use_tls=yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_sasl_tls_security_options = noanonymous
tls_random_source = dev:/dev/urandom

## SASL Settings - These are the setting to authenticate with 1and1. Basically it passes a username & password.
smtp_sasl_auth_enable = yes
relayhost=[auth.smtp.1and1.fr]:587
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

apres on crée le fichier de mot de passe :
emacs /etc/postfix/sasl_passwd
[auth.smtp.1and1.fr]:587 name@yourdomain.com:password

chown root.root /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd

postmap sasl_passwd
postfix check
/etc/init.d/postfix restart

apt-get install mailutils

tester avec : mail email@email.com
vérifier les logs : tail -f /var/log/mail.log

installation serveur : VSFTPD

apt-get install vsftpd
emacs /etc/vsftpd.conf

local_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES
write_enable=YES
force_dot_files=YES

bloquer ssh et activer ftp d'un user :

d'abord on crée un shell spécifique :
emacs /etc/ftponly
#!/bin/sh
echo "Welcome to my FTP Webserver. Please note that all activity is tracked for security purposes!"
exit

chmod a+x /etc/ftponly

mettre ce shell sur le user a verouiller :
emacs /etc/passwd

echo "/etc/ftponly" > /etc/shells

service vsftpd restart

installation serveur dédié - full

# compte et ssh
sudo su -
ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAoBrnflaoJfcCETItWRL2TpFi4Fi3V1SzZxu7yLpuyR5RgTqp64HEAQJqTPxgD7vQpGAETjBByk7+8TyIQnFiWhWp30Gi9w6pxcfHpOR1PtwyyeTsKY7NiEl3zatA9fn2tNKOO0U6GsNIwvVTdyPDTltGpGsTnRSbvKtuCr+ok5Ns5iicgu2+Icqxavte0XM8GV9+V8v+XhmVJaGpkCUMwwzidw0cKc1BpZwDlOwZw7KMQ6BJVEdloBeyHjQm3QIxuMoqrhy+xeJeboc/4HDbnvlrLNs95EZAoEyNhm5oNsS0ujFkWbHB7Zrc/qdHre/fIPIIshPEB85myyXyLnOtkw== rsa-key-20120215-raf" >> /root/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAh3lDPLIg3/cjLOTsFC7S4Day5H4VkA2dBTb/LrsmPOb5/NJhSyq703p4kKM7mkzvB4gRJ0/YpH4iVbD9H39nDYOQqSokB9QfLyrRp0bgZqtt5R+jZ/YUPnu852yn+BLn1pn9+cn+ycuq9K35rbsXn9k7gVoG4AanwW/IeK8jGgU= rsa-key-20161116-martin" >> /root/.ssh/authorized_keys
passwd

# authoriser le log root : http://blog.raphaelpiccolo.com/?p=137

# autocompletion bash en tant que root
apt-get install bash-completion
/root/.bashrc
remove "#" arround lines 99 : "/etc/bash_completion"

# securité anti spam ssh
apt-get install fail2ban

# bug sur ubuntu 16.04 kimsufi
rm /etc/apt/apt.conf.d/50unattended-upgrades.ucf-dist

# installation normale
apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get install unzip
apt-get install ocaml
apt-get install unrar
apt-get install lm-sensors
apt-get install emacs screen git ssh
apt-get install build-essential
apt-get install software-properties-common
apt-get install locate
apt-get install lshw
apt-get install imagemagick
apt-get install lftp curl

# DATE : http://blog.raphaelpiccolo.com/?p=304

# SUDO : http://blog.raphaelpiccolo.com/?p=374

# EDITOR :

# SERVEUR Postgresql : http://blog.raphaelpiccolo.com/?p=377
# SERVEUR MySQL : http://blog.raphaelpiccolo.com/?p=389
# SQL Mode : http://blog.raphaelpiccolo.com/?p=328
# SERVEUR MONGODB : http://blog.raphaelpiccolo.com/?p=210

# nodejs
# installation : http://blog.raphaelpiccolo.com/?p=63
# casperjs : http://blog.raphaelpiccolo.com/?p=106
# mocha : http://blog.raphaelpiccolo.com/?p=531

# PHP
# version 7 : http://blog.raphaelpiccolo.com/?p=393
# version 5 : http://blog.raphaelpiccolo.com/?p=331
emacs /etc/php/5.6/apache2/php.ini
memory_limit
upload_max_filezize
post_max_zize
apachectl restart

# SERVEUR WEB
apt-get install apache2
a2enmod proxy
a2enmod proxy_http
# server status : http://blog.raphaelpiccolo.com/?p=521
# APACHE ITK : http://blog.raphaelpiccolo.com/?p=396
# APACHE PHP FPM : http://blog.raphaelpiccolo.com/?p=399
# APACHE SUEXEC : http://blog.raphaelpiccolo.com/?p=401

# APACHE ET NODEJS : http://blog.raphaelpiccolo.com/?p=403

# letsencrypt : http://blog.raphaelpiccolo.com/?p=409

# INTERDIRE L'ACCES AUX DOSSIERS .git : http://blog.raphaelpiccolo.com/?p=405

# RUTORRENT : http://blog.raphaelpiccolo.com/?p=387

# SQUID : http://blog.raphaelpiccolo.com/?p=385

# MAIL
# complet : http://blog.raphaelpiccolo.com/?p=383
# relay : http://blog.raphaelpiccolo.com/?p=381

# VSFTPD : http://blog.raphaelpiccolo.com/?p=379

netdata : http://blog.raphaelpiccolo.com/?p=206

REDIS : http://blog.raphaelpiccolo.com/?p=407

#migrer sur un nouveau serveur : http://blog.raphaelpiccolo.com/?p=579

framework R&M

Système de pagination et de filtres compatibles

3 endroits : {{baseUrl}}?page={{page-1}}&{{moreurl}}
en haut ça :
{% set tmp = req.fullurlpaginate|split('?') %}
{% set baseUrl = tmp[0] %}
{% set moreurl = tmp[1] %}
sur chaque appel de paginate retirer le "with {baseUrl: '/'~session.locale~'/admin/activity'}"
dans server.js : req.fullurlpaginate = req.fullurl.replace(/\?page=\d*&?/, '?');

dans main.js : pathname = pathname.replace(/page=[0-9]*/, "page=0");

Sécuriser par adresse IP uniquement

Pour empêcher l’accès à votre site excepter en provenance des IP spécifiées, votre fichier .htaccess doit comporter les instructions suivantes:

.htaccessApache

Order Deny,Allow
Deny from all
Allow from 192.168.0.1 192.168.0.2

Les deux premières lignes permettent respectivement de spécifier l’ordre dans lequel on applique les restrictions et de refuser l’accès à toutes les adresses IP. La troisième ligne vous permet d’autoriser les IP spécifiées à accéder aux ressources. Si vous entrez plus d’une IP, il suffit de les séparer par un espace.
Remarque: vous pouvez également autoriser un domaine particulier.

downgrade php 7 vers 5.6

add-apt-repository ppa:ondrej/php
apt-get update
apt-get install php5.6 php5.6-mysql php5.6-mbstring libapache2-mod-php5.6 php5.6-intl php5.6-gd php5.6-xml php5.6-zip php5.6-curl php-apcu

From php5.6 to php7.0:
Apache:
a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart
CLI:
update-alternatives --set php /usr/bin/php7.0

From php7.0 to php5.6:
Apache:
a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart
CLI:
update-alternatives --set php /usr/bin/php5.6

mysql mode

SELECT @@sql_mode;

renvoie : ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

on peut setter avec :
set sql_mode = '';

ou mieux :
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

ou alors dans
emacs /etc/mysql/mysql.conf.d/mysqld.cnf
ajouter cette ligne dans la section [mysqld]
sql-mode = ""
puis
service mysql restart

curl

formulaire en POST avec cookies
curl -b c.txt -c c.txt http://ecni.fr:6001/fr/login?format=json --data email=xxxx&password=xxxx
curl -b c.txt -c c.txt -X POST http://ecni.fr:6001/fr/patient/2/sequence/create?format=json --data description=test

tunnel ssh

On veut que A devienne accessible de l'extérieur :
A est derrière un NAT
B est accessible par les deux
C est derrière un NAT ou pas

port forward sur B
AllowTcpForwarding yes

D'un coté on fait ça :
root@A:~# ssh -nNT -R 1103:localhost:22 root@B

De l'autre on fait ça :
root@C:~# ssh root@B
root@B:~# ssh root@localhost -p 1103

pour que le tunnel se relance tout seul en cas de plantage ou de pare feu chiant on peut mettre cette comamnde dans le cron :
@reboot autossh -M 10984 -N -f -o "PubkeyAuthentication=yes" -R 1103:localhost:22 root@B &

notifications push avec ios

dans le viewcontroller (pour effacer le compteur de notif sur l’icone de lapp):
UIApplication.shared.applicationIconBadgeNumber = 0

dans le appdelegate :
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings( settings )
application.registerForRemoteNotifications()
return true;
}

func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) {
var deviceTokenString: String = ""
for i in 0..

unison

LINUX
=====
apt-get update
apt-get upgrade
apt-get install ocaml

wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.4.tar.gz
tar -xzf unison-2.48.4.tar.gz
mv src unison-2.48.4
cd unison-2.48.4
make

cp unison /bin/unison

MAC
===
brew install ocaml
wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.4.tar.gz
tar -xzf unison-2.48.4.tar.gz
mv src unison-2.48.4
cd unison-2.48.4
make

cp unison /bin/unison

WINDOWS
=======
https://www.irif.fr/~vouillon/unison/unison%202.48.4.zip

exemple de fichier prf
======================
emacs ~/.unison/raf.prf

# Unison preferences
root = ssh://raf@46.105.126.96//home/raf
root = C:\Users\raf
sshcmd=ssh.exe
sshargs=-C -pw MOTDEPASSE
path = Music
path = Pictures
path = Downloads
path = Videos
path = .ssh
path = .popcap
path = .sublime
path = .syntevo
path = .unison
path = .filezilla
path = .gitconfig
path = .rtorrent.rc
ignore = Regex \.unison/[a-z0-9]{8}
ignore = Regex \.unison/[a-z0-9]{34}
ignore = Name {.filezilla/queue.sqlite3}
ignore = Name {.notepad++/session.xml}
ignore = Name {app/cache}
ignore = Name {app/logs}
ignore = Name {vdrive/.sys/apache2/logs}
ignore = Name {vdrive/.sys/mysql/data}
ignore = Name {vdrive/.sys/mongodb/data}
ignore = Name {vdrive/profiling}
ignore = Name {.sublime/Local/License.sublime_license}
ignore = Name {thumbs.db}
ignore = Name {desktop.ini}
ignore = Name {.DS_Store}
ignore = Path {Documents/Ma musique}
ignore = Path {Documents/Mes images}
ignore = Path {Documents/Mes vidéos}
ignore = Name {Folder.jpg}
ignore = Name {AlbumArt*.jpg}
ignore = Name {.picasa.ini}
ignore = Name {.SyncArchive}
ignore = Name {.SyncID}
ignore = Name {.SyncIgnore}
ignore = Name {Ignore}
ignore = Name {trading/db}
times = false
auto = true
perms = 0
diff = "C:\Users\raf\Downloads\programmes\WinMerge-2.14.0\WinMergeU.exe"

https via nodejs uniquement

var config = require('./config.js');
var app = express();
var server = require('https').Server({
key: fs.readFileSync('site.key'),
cert: fs.readFileSync('site_public.crt'),
ca: [fs.readFileSync('site_intermediate.crt')],
passphrase: 'password'
}, app);
// or var server = require('https').Server(app);

app.get('/', function (req, res) {
return res.send('online');
});
app.use(function(req, res) {
res.status(404).render('error', {error: 'Page introuvable'});
})
server.listen(config.port, function() {
console.log('ready to go on '+config.port);
});

resize iframe auto

On met sur le 1er site :

<script type="text/javascript">
function resizeCrossDomainIframe(id, other_domain) {
var iframe = document.getElementById(id);
window.addEventListener('message', function(event) {
if (event.origin !== other_domain) return; // only accept messages from the specified domain
if (isNaN(event.data)) return; // only accept something which can be parsed as a number
var height = parseInt(event.data) + 32; // add some extra height to avoid scrollbar
iframe.height = height + "px";
}, false);
}
</script>

<iframe id="framence" src="http://localhost:3000/fr/etablissement/2/client/admission" style="width: 100%; border: none;" onload="resizeCrossDomainIframe('framence', 'http://site2');">
<p>Votre navigateur ne supporte pas l'élément iframe</p>
</iframe>

on mets sur le 2e site :
setInterval(function () {
parent.postMessage($('body').height(), 'http://site1');
}, 1000);

distance entre deux coordonnées en mysql

$lat = 48.833297;
$lng = 2.298454;

// pour des miles : 3959
// pour des km : 6371

$sql = 'SELECT
name,
( 6371 * acos( cos( radians('.$lat.') ) * cos( radians( locations.lat ) )
* cos( radians(locations.lng) - radians('.$lng.')) + sin(radians('.$lat.'))
* sin( radians(locations.lat)))) AS distance
FROM locations
WHERE active = 1
HAVING distance < 10 ORDER BY distance'

xcode

installer brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

installer ruby avec brew
brew install rbenv ruby-build

activer ruby
echo 'eval "$(rbenv init -)"' >> /.bash_profile
rbenv install 2.2.2
rbenv global 2.2.2
ruby -v

installer cocoapods
sudo gem install cocoapods

installer canvas
lancer à la racine du projet
pod init

emacs Podfile
platform :ios, '9.0'
dans le target qui set la pas le target test, mettre :
pod 'Canvas', '~> 0.1'
lancer
pod install

youtube responsive

<figure>
<iframe width="560" height="315" src="https://www.youtube.com/embed/1vTPNHjvbQY?autoplay=true" frameborder="0" allowfullscreen></iframe>
</figure>

<style>
video {
width: 100% !important;
height: auto !important;
}
</style>

<script type="text/javascript">
$(function() {

var $allVideos = $("iframe"),
$fluidEl = $("figure");

$allVideos.each(function() {

$(this)
// jQuery .data does not work on object/embed elements
.attr('data-aspectRatio', this.height / this.width)
.removeAttr('height')
.removeAttr('width');

});

$(window).resize(function() {

var newWidth = $fluidEl.width();
$allVideos.each(function() {

var $el = $(this);
$el
.width(newWidth)
.height(newWidth * $el.attr('data-aspectRatio'));

});

}).resize();

});
</script>

optimize and purge mysql data

mysqldump -u root -p --databases `echo "show databases" | mysql -u root -p | grep -Ev "^(Database|mysql|performance_schema|information_schema)$"` > mydb.sql

service mysql stop
remove your databases and ib*. Keep mysql, performance_schema, ...
cd /var/lib/mysql && rm -rf ib* {{{{{{{databases}}}}}}}

Add the following lines to /etc/mysql/my.cnf
[mysqld]
innodb_file_per_table=true

service mysql start
mysql -u root -p < mydb.sql

installation serveur : mongodb

apt-get install mongodb php-mongo

service mongodb start
service mongodb restart

imports et exports de toute les bdd
mongodump --out pathtobackup
mongorestore pathtobackup

import et export de quelques enregistrements :
mongoexport -d ecni_prod -c candidateanswer -q '{"id": 12345}' -o output.js
mongoexport -d ecni_prod -c candidateanswer -q '{"id": {"$in": [12345]}}' -o output.js
mongoimport -d ecni_prod -c candidateanswer output.js

Déplacer le dossier contenant les bases de données :

mkdir -p /home/mongodb/databases/

emacs /etc/mongodb.conf
dbpath=/home/mongodb/databases/

service mongodb restart

crontab pour les dumps réguliers :
crontab -e
0 1 * * * /usr/bin/mongodump --out /home/mongodbbackup/`date +\%Y-\%m-\%d`
0 * * * * find /home/mongodbbackup/ -mtime +30 -mindepth 1 -maxdepth 1 -exec rm -rf {} \;

netdata

bash <(curl -Ss https://my-netdata.io/kickstart.sh)

#restart
systemctl restart netdata

API
https://raw.githubusercontent.com/firehol/netdata/master/web/netdata-swagger.yaml
http://2i.raphaelpiccolo.com:19999/api/v1/charts

Rendre disponible depuis https:
créer un domaine (sur ovh par ex)
créer les certificats avec letsencrypt
créer un htpasswd (/etc/apache2/.htpasswd)
ajouter un vhost

<VirtualHost *:80>
ServerName netdata.raphaelpiccolo.com

RewriteEngine on
RewriteRule ^/(.*) https://netdata.raphaelpiccolo.com/$1 [L,R]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName netdata.raphaelpiccolo.com

SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/netdata.raphaelpiccolo.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/netdata.raphaelpiccolo.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/netdata.raphaelpiccolo.com/chain.pem"

ProxyRequests Off
ProxyPass / http://localhost:19999/
ProxyPassReverse / http://localhost:19999/
ProxyPreserveHost On</VirtualHost>
</IfModule>

borg backup

https://github.com/borgbackup/borg/releases

cp borg-linux64 /usr/local/bin/borg
chown root:root /usr/local/bin/borg
chmod 755 /usr/local/bin/borg

if necessary :
apt-get install python3 python3-dev python3-pip python-virtualenv libssl-dev openssl libacl1-dev libacl1 liblz4-dev liblz4-1 build-essential libfuse-dev fuse pkg-config

borg init backupdir
borg create backupdir::nameofthissave filesandfolderstosave
borg list backupdir::nameofthissave
borg extract backupdir::nameofthissave
borg delete backupdir::nameofthissave
borg info backupdir::nameofthissave

backupdir can be a localpath like /home/borg/backup
or a distant path : borg@backup.server.fr:/home/borg/backup

rediriger les emails locaux du serveur avec postfix

Exemple:
dans la fenetre 1
ssh user1@server

dans la fenetre 2
ssh user2@server
mail -s sujet
To: user1
message

Dans la première fenêtre on fait entrer et on voit : "you have new mail in /var/mail/user1"
à ce moment là rien n'est redirigé. (état par défaut)
on peut faire pour voir les mails :
emacs /var/mail/user1

On peut rentrer des alias la dedans :
emacs /etc/aliases

ajouter
user1: destinataire

destinataire peut etre un user local (root) ou un email complet

lancer cette commande pour mettre à jour :
newaliases

Envoyer des emails depuis un serveur dedié ovh

Installer un serveur smtp :
apt-get install mailutils
choisir le mode internet (relay smtp)
mettre le nom de domaine du serveur

Pour rediriger les mails d'un user linux sur une vraie boite mail, créer ce fichier et y écrire l'email : ~/.forward

On peut faire des mails avec la commande : mail -s sujet

Sinon on peut faire une connexion manuelle :
nc destinataire.fr 25
EHLO source.fr
MAIL FROM: supertool@source.fr // on peut tuner le from, mais si c'est pas notre serveur on arrive en spam
RCPT TO: test@destinataire.fr
DATA
salut
.

MYSQL: start: Job failed to start

root@backup:~# service mysql stop
stop: Unknown instance:

root@backup:~# service mysql start
start: Job failed to start

root@backup:~# tail /var/log/mysql/error.log
150928 15:50:56 InnoDB: Using Linux native AIO
/usr/sbin/mysqld: Can't create/write to file '/tmp/ib9ovWdJ' (Errcode: 13)
150928 15:50:56 InnoDB: Error: unable to create temporary file; errno: 13
150928 15:50:56 [ERROR] Plugin 'InnoDB' init function returned error.
150928 15:50:56 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
150928 15:50:56 [ERROR] Unknown/unsupported storage engine: InnoDB
150928 15:50:56 [ERROR] Aborting
150928 15:50:56 [Note] /usr/sbin/mysqld: Shutdown complete

root@backup:~# ls -l /|grep tmp
drwxr-xr-x 4 root root 937984 Sep 28 15:50 tmp

root@backup:~# sudo chmod 777 /tmp
root@backup:~# sudo chmod +t /tmp

root@backup:~# service mysql start
mysql start/running, process 1451

envoyer des email d'un serveur ovh depuis gmail

soit c'est une vraie boite mail auquel cas il suffit de faire une liaison imap. Dans le cas contraire il faut suivre cette procédure.

Dans ovh il y a des redirections mails et des comptes mails. Si les comptes mails ne sont pas disponibles il faut activer un hébergement. (par exemple le start10m gratuit)
- mettre la conf par défaut dans les mx du dns.
- reset le mdp
- mettre l'ip du bon serveur dans le le champs A du dns.
- créer une redirection contact@domaine.com => votre email

Puis, pour pouvoir utiliser cet email pour faire vos envois depuis gmail :
dans gmail => Parametres => compte => ajouter une autre adresse email

nom : Ce qu'on veut
email : contact@domaine.com
traiter comme un alias

serveur : smtp.domaine.com
utilisateur : postmaster@domaine.com
mot de passe : xxxxxxxxxxxxx
type : ssl
port : 465

gmail envoie un message a cet email.
recupéré le numéro magique qui s'y trouve et hop on peut envoyer des mails à partir de contact@... tout en étant sur gmail

tar par ssh

quand un serveur n'a plus d'espace libre. Il suffit de lancer un tar qui push ses données via ssh sur un deuxieme serveur :

ssh root@suce.com "tar zcvf - /home/suce" > /home/suce.tgz

l'opposé est aussi possible : extraire un tar vers un autre serveur

cat archive.tar.gz | ssh server2 "cd /path/to/dir; tar zxvf -"

apache mysql php mongodb sur MAC OS X el capitan

APACHE

sudo apachectl start
httpd -v

id
=> get username and change in conf
User XXX
Group XXX

sudo emacs /etc/apache2/httpd.conf

DocumentRoot "/Users/username/Sites/"

AllowOverride All
Options Indexes MultiViews FollowSymLinks
Require all granted

LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule php5_module libexec/apache2/libphp5.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

sudo apachectl restart

http://localhost

MYSQL

http://dev.mysql.com/downloads/mysql/

sudo /usr/local/mysql/support-files/mysql.server start

/usr/local/mysql/bin/mysql -v

/usr/local/mysql/bin/mysqladmin -u root password 'yournewpasswordhere'

emacs .bash_profile
export PATH="/usr/local/mysql/bin:$PATH"

# 2002 mysql socket error
sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

PHP

disactivat SIP : disactivate SIP : http://www.macworld.com/article/2986118/security/how-to-modify-system-integrity-protection-in-el-capitan.html

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

cd /usr/lib/php
sudo php install-pear-nozlib.phar
sudo pear channel-update pear.php.net
sudo pecl channel-update pecl.php.net
sudo pear upgrade-all
sudo pear config-set auto_discover 1

brew install autoconf

brew install icu4c
sudo pecl install intl
The path to the ICU libraries and headers is: /usr/local/opt/icu4c/

sudo cp /etc/php.ini.default /etc/php.ini
sudo chmod u+w /etc/php.ini
sudo emacs /etc/php.ini
date.timezone = "Europe/Paris"
error_reporting = E_ALL
display_errors = On
memory_limit = 1024M
extension=intl.so

attention : pas les .dll, ils ne marchent pas

MONGODB

brew install mongodb
sudo services start mongodb

MONGODB DANS PHP

attention ca cree un nouveau php en plus de l'actuel, avec ses propres fichiers de conf.
php: /usr/local/opt/php56/bin/php
php --ini : /usr/local/etc/php/5.6/php.ini
verifier qu'une extension est installee :
php -i | grep "XXX"

brew install php56-mongo

emacs ~/.bashrc
export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"

sudo emacs /etc/apache2/httpd.conf
#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php5_module /usr/local/Cellar/php56/5.6.22/libexec/apache2/libphp5.so

sudo apachectl restart

INTL VIA BREW

brew install php56-intl

sudo apachectl restart

TEST

sudo emacs phpinfo.php

http://localhost/phpinfo.php

TEST MONGO
comedy;
$collection = $db->cartoons;
$document = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($document);
$document = array( "title" => "XKCD", "online" => true );
$collection->insert($document);
$cursor = $collection->find();
foreach ($cursor as $document)
echo $document["title"] . "\n";
?>

serveur ssh - accès root

emacs /etc/ssh/sshd_config

Autoriser root a se connecter :
PermitRootLogin yes

Par cle ssh :
ssh-keygen

Mettre sa propre clé dans /root/.ssh/authorized_keys

Activer le log par mdp : (moi il a fallut commenter la ligne -la valeur par defaut c'est yes)
PasswordAuthentication yes

avoir des infos dans les logs :
SyslogFacility AUTH
LogLevel VERBOSE

si on a le message
"Please login as the user "ubuntu" rather than the user "root"."
il faut effacer les settings de la cle ssh ici :
emacs /root/.ssh/authorized_keys

casper.js + phantom.js

npm install -g phantomjs  --unsafe-perm
npm install -g casperjs

installer python (bien vérifier qu'il est dans le path après l'installation) version 2.7
https://www.python.org/downloads/

Mettre ça dans un fichier test.js :
var casper = require('casper').create();
casper.start('http://gextra.net/', function() {
this.capture('screenshot.png');
});
casper.run(function() {
console.log('fini');
casper.exit();
});

et lancer en faisant :
casperjs test.js

emacs launcher.js

var spawn = require("child_process").spawn;

var casperbin = "";
if (require("os").type() == "Windows_NT") casperbin = "casperjs.cmd";
else casperbin = "casperjs";

process.argv.shift();
process.argv.shift();

var p = spawn(casperbin, process.argv);

p.stdout.on("data", function(line) {
console.log(line.toString().trim());
});

p.stderr.on("data", function(line) {
console.log(line.toString().trim());
});

p.on("close", function(code) {
console.log("exited with " + code);
});

fast cache php / image du jour bing

$cache = '/tmp/imgoftheday.txt';
$nbsecondes = 3600;
if (!file_exists($cache) || (filemtime($cache) <= (time() - $nbsecondes )))
{
  $json = json_decode(file_get_contents('http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US'), true);
  $res = 'http://www.bing.com'.$json['images'][0]['url'];
  file_put_contents($cache, $res);
}
else
  $res = file_get_contents($cache);
echo $res;

xdebug

php.ini
extension=php_xdebug.dll
mieux (pour avoir moins de warnings :
zend_extension=Z:/.sys/php/ext/php_xdebug.dll

[Xdebug]
xdebug.default_enable=On
xdebug.show_local_vars=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir="Z:\profiling"
xdebug.profiler_output_name="cachegrind.out.%s%r"

telecharger wincachegrind

lancer un script/page et ouvrir l'archive générée

nodejs

== manuel ==

aller ici prendre le tar.gz https://nodejs.org/en/download/
wget https://nodejs.org/dist/v6.11.1/node-v6.11.1.tar.gz
tar -xzf node-v6.11.1.tar.gz
cd node-v6.11.1
./configure
make
make install
node --version
npm --version

== ou a partir des binaires ==

wget http://nodejs.org/dist/latest-v8.x/node-v8.11.1-linux-x64.tar.gz
#wget http://nodejs.org/dist/latest-v8.x/node-v8.11.1-linux-x64.tar.gz
#wget https://nodejs.org/dist/v8.11.1/node-v8.11.1-linux-x64.tar.xz
tar -xzf node-v8.11.1-linux-x64.tar.gz
ln -s /node-v8.11.1-linux-x64/bin/node /bin/node
ln -s /node-v8.11.1-linux-x64/bin/npm /bin/npm
ln -s /node-v8.11.1-linux-x64/bin/npx /bin/npx

== passer en prod : (daemon) ==

npm install -g forever
forever start server.js
(reboot en cas de fichier source modifié)
forever start -w server.js
eteindre un script
forever stop script

== debug: ==
DEBUG=* node server.js

déplacement dossiers personels

mklink /J Contacts D:\raf\Contacts
mklink /J Pictures D:\raf\Pictures
mklink /J Videos D:\raf\Videos
mklink /J Downloads D:\raf\Downloads
mklink /J Documents D:\raf\Documents
mklink /J Music D:\raf\Music
mklink /J Desktop D:\raf\Desktop

attrib /L Contacts +S +H +I
attrib /L Pictures +S +H +I
attrib /L Videos +S +H +I
attrib /L Downloads +S +H +I
attrib /L Documents +S +H +I
attrib /L Music +S +H +I
attrib /L Desktop +S +H +I

masquer les bibliotheques (peut poser pb)

masquer les bibliothèques
Ouvrez le menu Démarrer et saisissez regedit puis faites Entrée.
Recherchez la clé suivante à l’aide de l’arborescence : HKEY_CLASSES_ROOT\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}\ShellFolder
Faites ensuite un clic-droit sur la clé ShellFolder et optez pour Autorisations.
modifiez le proprietaire de la cle pour mettre vous-même
donnez à l'administrateurs le controle total
modifiez la clé du registre Attributes et saisissez la valeur suivante : b090010d
au lieu de : b080010d

install pc windows

driver wifi lan

enlever les points de restauration :
propriete sur ordinateur / propriete systeme / protection du systeme : desactiver

autoriser les connexion à distance :
propriete sur ordinateur / propriete systeme / connexion à distance

desactiver la mise en veille :
panneau de configuration / options d'alimentation / paramêres avancé / veille / autoriser les minuteurs de sortir de veille : désactiver.

centre de maintenance :
desactiver contrôle des comptes
desactiver smart screen

activer super admin :
lancer cmd en administrateur et faites : net user administrateur /active:yes

desactiver le pare feu
desactiver defender

liens symboliques vers les fichiers de conf :
mklink /J "C:\Program Files (x86)\Git\.ssh" "c:\Users\raf\.ssh"
mklink /J "C:\Users\raf\.filezilla" "C:\Users\raf\AppData\Roaming\FileZilla"
mklink /J "C:\Users\raf\.syntevo" "C:\Users\raf\AppData\Roaming\syntevo"
mklink /J "C:\Users\raf\.popcap" "C:\ProgramData\PopCap Games"
mklink /J "C:\Users\raf\.sublime" "C:\Users\raf\AppData\Roaming\Sublime Text 3"

changer le dossier de telechargement de chrome pour mettre le bureau

personaliser barre des taches : toujours afficher les icones

config ssh:
Open putty
In the categories pane, make sure that Session is selected.
click load
Select SSH as the protocol under the PuTTY basic options.
In the categories pane, click Connection ?> SSH.
Select 2 as the preferred SSH protocol version.
In the categories pane, click Auth.
Select putty key
In the categories pane, click Session.
In the Saved Sessions window, click Default Settings.
Click Save to save your settings.

Désactiver port 80 skype

demarrer direct sur le bureau :
propriete sur la barre des taches, puis "acceder au bureau au lieu de l'accueil" et afficher l'arriere plan

thisPcTweaker : ajouter google drive et compte perso

booter bios hp

1-Pour pouvoir démarrer à partir du CD / DVD effectuer les étapes ci-dessous:
* Démarrer le Pc.
* Appuyer sur la touche ESC au démarrage pour afficher le menu de démarrage.
* Appuyer sur la touche F10 « Configuration de l'ordinateur » (En option,
l'utilisateur peut appuyer sur
F10 à partir du menu de démarrage).
* Aller dans le menu « Sécurité » puis « Configuration d'amorçage sécurisé »
* Valider le message par F10
* Changer le premier élément « Assistance pour les anciens équipements » à
<Activé>
* Changer le deuxième élément « Amorçage sécurisé » à <Désactivé>
* Changer le dernier élément « Amorçage rapide » à <Désactivé>
* Valider par F10
* Allez dans le menu « Stockage », puis « Ordre de démarrage ».
* sélectionner Source de démarrage UEFI et appuyez sur F5 pour les désactiver,
valider par F10.
REMARQUE: Assurez-vous que les Sources de démarrage héritées sont activées et
que Le Lecteur de CD-ROM/DVD ATAPI est le premier dans la liste.
* Allez dans le menu « Fichier », puis sélectionnez « Enregistrer les
modifications et Quitter ».

git branch and git flow

LES BRANCHES :
--------------

http://www.synbioz.com/blog/git-adopter-un-modele-de-versionnement-efficace

voir les branches:
git branch [-a]

- créer une branche :
git branch develop # créer la branche
git checkout develop # aller sur la branche
NOUVELLE FONCTIONALITE
git checkout -b feature/foo develop # créer la branche et aller dessus
git commit -a -m "test"
git push

PUSH SUR DEVELOP
git checkout develop
git merge --no-ff feature/foo
git branch -d feature/foo
git push origin develop

PUSH SUR PROD
git checkout master
git merge --no-ff release/v1.2
git tag -a v1.2

- push aussi sur dev la release
git checkout develop
git merge --no-ff release/v1.2
git branch -d release/v1.2.1

HOTFIX
git checkout -b hotfix/v1.2.1 master
git commit -a -m "Bumped version number to 1.2.1"
git commit -m "Fix huge production bug"
git checkout master
git merge --no-ff hotfix/v1.2.1

- push aussi sur dev:
git checkout develop
git merge --no-ff hotfix/v1.2.1
git branch -d hotfix/v1.2.1
git flow init

NOUVELLE FONCTIONALITE
git flow feature start foo
git commit -am "fonctionalite"
git push
git flow feature finish foo

pour envoyer une feature : git flow feature publish foo
pour recupérer une feature : git flow feature pull origin foo

PUSH PROD
git flow release start v1.0.0
git commit -am "fonctionalite"
git push
git flow release finish v1.0.0

HOTFIX
git flow hotfix start typo
git flow hotfix finish typo