Category Archives: Unix

How to get Gitlab-CI to work with apache

After using some hours searching on google and asking on IRC, i found the solution on why Gitlab-CI didn’t work in my setup with a docker image.

The default installation of GitLab uses Nginx, however in my setup i have an Apache 2.4 as the primary webserver, because other services are also running on this particular virtual machine.

My installation is an upgrade from GitLab 7.x to 8.1 and perhaps it as also introduced some issues.

So, the main issue is that gitlab-git-http-server is running as a socket as default.

In your apache config you need something like this.

<VirtualHost *:80>
  ServerAdmin admin@domain.tld
  ServerName gitlab.domain.tld
  ServerAlias gitlab

  ProxyPreserveHost On
  <Location />
      Require all granted
      ProxyPassReverse http://localhost:8080

      #Allow forwarding to gitlab-git-http-server
      ProxyPassReverse http://127.0.0.1:8181
  </Location>

  RewriteEngine on

  #Forward these requests to gitlab-git-http-server
  RewriteCond %{REQUEST_URI} ^/[\w\.-]+/[\w\.-]+/repository/archive.* [OR]
  RewriteCond %{REQUEST_URI} ^/api/v3/projects/.*/repository/archive.* [OR]
  RewriteCond %{REQUEST_URI} ^/[\w\.-]+/[\w\.-]+/(info/refs|git-upload-pack|git-receive-pack)$
  RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA]

  #Forward any other requests to GitLab Rails app (Unicorn)
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
  RewriteCond %{REQUEST_URI} ^/uploads
  RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA,NE]

  DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public
  ErrorDocument 404 /404.html
  ErrorDocument 422 /422.html
  ErrorDocument 500 /500.html
  ErrorDocument 503 /deploy.html

  LogLevel warn
  ErrorLog /var/log/apache2/gitlab.domain.tld-error.log
  CustomLog /var/log/apache2/gitlab.domain.tld-access.log combined
</VirtualHost>

And add/change the /etc/gitlab/gitlab.rb

########################
# GitLab git http server #
##########################
# see https://gitlab.com/gitlab-org/gitlab-git-http-server/blob/master/README.md

gitlab_git_http_server['enable'] = true
# gitlab_git_http_server['ha'] = false
# gitlab_git_http_server['repo_root'] = "/var/opt/gitlab/git-data/repositories"
gitlab_git_http_server['listen_network'] = 'tcp'
gitlab_git_http_server['listen_umask'] = 0
gitlab_git_http_server['listen_addr'] = 'localhost:8181'
# gitlab_git_http_server['listen_addr'] = "/var/opt/gitlab/gitlab-git-http-server/socket"
# gitlab_git_http_server['auth_backend'] = "http://localhost:8080"
# gitlab_git_http_server['pprof_listen_addr'] = "''" # put an empty string on the command line
# gitlab_git_http_server['dir'] = "/var/opt/gitlab/gitlab-git-http-server"

Then restart you Apache and reconfigure gitlab

apachectl graceful
sudo gitlab-ctl reconfigure

Now when the GitLab-CI can fetch the git repository using HTTP with authentication. However, on my setup, it still seems much slower than using SSH/GIT, but it might has something to do with the size of my repository.

UPDATED 12/November/2015: Added the whole Apache VirtualHost config

Mindske størrelsen på et lvm mount på Ubuntu kørende i VMware

En kunde havde fået tildelt lidt for meget plads til nogle virtuelle maskiner, og de ønskede at diskstørrelserne gjort mindre, så de ikke lige pludselig kom til at bruge alt pladsen.

Fremgangsmåden jeg benyttede er lånt fra Technogrip, og beskriver det til CentOS og for root-filsystemet. I mit tilfælde drejdede det sig om en ekstra disk, og derfor ser det lidt anderledes ud. F.eks. behøver jeg ikke at boote i rescue mode.

# df -h
  Filesystem                   Size  Used Avail Use% Mounted on
  /dev/mapper/ubuntu-root       19G  3,4G   15G  19% /
  udev                         3,0G  4,0K  3,0G   1% /dev
  tmpfs                        1,2G  260K  1,2G   1% /run
  none                         5,0M     0  5,0M   0% /run/lock
  none                         3,0G     0  3,0G   0% /run/shm
  /dev/sda1                    228M   47M  170M  22% /boot
  /dev/mapper/storage-storage 1000G  135G  815G  15% /storage

I bunden ses det store 1000GB drev, som der ønskes at laves til 200GB i stedet

Først skal drevet unmountes

# umount /storage

For en sikkerhedsskyld laver i et check på drevet

# fsck -fC /dev/mapper/storage-storage 
fsck from util-linux 2.20.1
e2fsck 1.42 (29-Nov-2011)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity                                        
Pass 4: Checking reference counts
Pass 5: Checking group summary information                                     
/dev/mapper/storage-storage: 461/65536000 files (9.8% non-contiguous), 35546593/262144000 blocks

Herefter ændre vi det logiske drev til 200GB

# lvresize -r /dev/storage/storage --size 200G
fsck from util-linux 2.20.1
e2fsck 1.42 (29-Nov-2011)
/dev/mapper/storage-storage: clean, 461/65536000 files, 35546593/262144000 blocks
resize2fs 1.42 (29-Nov-2011)
Resizing the filesystem on /dev/dm-0 to 52428800 (4k) blocks.
The filesystem on /dev/dm-0 is now 52428800 blocks long.

  Reducing logical volume storage to 200,00 GiB
  Logical volume storage successfully resized

Det fysiske drev er stadig den gamle størrelsen, men har nu +800GB tilgængelig

# pvs
  PV         VG      Fmt  Attr PSize    PFree  
  /dev/sda5  ubuntu  lvm2 a-     19,76g  16,00m
  /dev/sdb1  storage lvm2 a-   1023,99g 823,99g

Herefter kan vi ændre den fysiske drev sættes til lidt over hvad vi bruger på den logiske. Det kunne være 200.01, men jeg har valgt 1GB ekstra. (Den ekstra størrelse skyldes at man ikke kan sætte størrelsen i extents og 200G vil være 1 extent for kort)

# pvresize /dev/sdb1 --setphysicalvolumesize 201G
  Physical volume "/dev/sdb1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Vores fysiske drev i LVM ser nu sådan ud.

# pvs
  PV         VG      Fmt  Attr PSize   PFree   
  /dev/sda5  ubuntu  lvm2 a-    19,76g   16,00m
  /dev/sdb1  storage lvm2 a-   201,00g 1020,00m

Herefter er det tid til at rette partitonen. Først skal vi den nye størrelse på drevet i sektører.

# pvs --unit s
  PV         VG      Fmt  Attr PSize      PFree   
  /dev/sda5  ubuntu  lvm2 a-    41435136S   32768S
  /dev/sdb1  storage lvm2 a-   421519360S 2088960S

og herefter hvornår drevet starter.

# parted /dev/sdb unit s print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 2147483648s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End          Size         Type     File system  Flags
 1      63s    2147472809s  2147472747s  primary               lvm

Nu er det tid til at resize partionen. Først slettes den gamle partition 1, som vist herover. Bare vælg cancel til fejlen. Vi tilføjer den igen lige om lidt.

# parted /dev/sdb rm 1
Error: Partition(s) 1 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.
As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
Ignore/Cancel? C                                                          
Information: You may need to update /etc/fstab.                           

Herefter opretter vi den nye partition, med den samme startposition og den nye slutposition, som er længden på de 421519360S+63S = 421519423s.

# parted /dev/sdb mkpart primary 63s 421519423s
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I                                                          
Error: Partition(s) 1 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.
As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
Ignore/Cancel? C                                                          

Vi aktivere lvm for den nye partition.

# parted /dev/sdb set 1 lvm on
Error: Partition(s) 1 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.
As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
Ignore/Cancel? C        

Den nye partition ser hermed sådan ud.

# parted /dev/sdb unit s print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 2147483648s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End         Size        Type     File system  Flags
 1      63s    421519423s  421519361s  primary               lvm                                                  

For en sikkerhedsskyld laver vi igen et check på storage.

# fsck -fC /dev/storage/storage 
fsck from util-linux 2.20.1
e2fsck 1.42 (29-Nov-2011)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information                                     
/dev/mapper/storage-storage: 461/13107200 files (11.1% non-contiguous), 32252895/52428800 blocks

Den nye storage kan nu mountes. Tag evt en reboot for at sikre at det virker.

# mount /storage

# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu-root       19G  3,4G   15G  19% /
udev                         3,0G  4,0K  3,0G   1% /dev
tmpfs                        1,2G  260K  1,2G   1% /run
none                         5,0M     0  5,0M   0% /run/lock
none                         3,0G     0  3,0G   0% /run/shm
/dev/sda1                    228M   47M  170M  22% /boot
/dev/mapper/storage-storage  200G  123G   67G  65% /storage

Rettelse af størrelse i VMware

SSH in på VMware hypervisor

Udregn den nye størrelse på drevet.

vmdk_shrunken = [x * (1024*1024*1024)] / 512

Hvor x er størrelsen i GB (i eksemplet 201GB)

Denne størrelse indsættes i vmdk-filen.

# vi /path/to/original_vmdk

Find den linje der ligner nedestående og tilpas tallet

# Extent description
RW 421527552 VMFS “foo-flat.vmdk”

Export til en ny VMDK. Dette kræver at maskinen er lukket ned imens dette sker. Kan tage nogle timer alt efter størrelse på drevet og hastigheden på de diske der benyttes.

# vmkfstools -d thin -i virtualname_1.vmdk virtualname_1mod.vmdk

( -d thin er valgfrit, men gør at drevet kun fylder den nuværende brugte mængde i den virtuelle maskine)

Log ind på ESX (vcenter), fjern drevet og tilføj den nye drev til maskinen. Fjern maskinen fra Inventory og tilføj den igen.

Herefter kan den virtuelle maskine startes igen, og jobbet er udført.

shrink / ext3 on a lvm2 setup

Jeg har en internt server i mit firma hvilket jeg havde fået acceptere et lidt for meget standard setup.
Dette betød at jeg havde en ubuntu med 50GB root mount, hvilket jeg gerne vil have gjort mindre til 15GB og flytte 30GB over på en anden mount.

Efter lidt søgen (tak google), så fandt jeg følgende løsning.

Bemærk at dette er ikke en helt sikker metode, så søg for at have backup

  • Boot ubuntu live cd
  • Start en root shell

Derefter kørte jeg følgende kommandoer, som fundet på dette link.


lvm vgscan (discover volume groups)
lvm vgchange -ay (activate all discovered VGs)
lvm lvscan (scan and return info about the LVs)
vgdisplay (display info about the VGs)
lvdisplay (display info about the LVs)
tune2fs -l /dev/volumegroup/rootvolume
e2fsck -f /dev/volumegroup/rootvolume (do a check of the current fs)
resize2fs /dev/mapper/volumegroup-rootvolume nnnG (resize the file system, where nnn is the number of gigabytes you want, and G tells resize2fs that nnn is in gigs).
lvreduce -L-xxG /dev/volumegroup/rootvolume (to reduce the size by xx Gigs).
e2fsck -f /dev/volumegroup/rootvolume (recheck the fs) Note: If the check fails, do an lvextend -L+xxG /dev/volumegroup/rootvolume to resize the LV back to where it was, and then re-run the e2fsck to confirm that it's ok. The most likely cause is using the wrong xx or nnn for the resizes.
  • Boot maskinen
  • lvextend -L +25G /dev/volumegroup/rootvolume
  • resize2fs /dev/volumegroup/rootvolume

Færdig, og nu har jeg flyttet mere plads over på mit backup storage.

Installering af MySQL gem

I forbindelse med mit bachelorprojekt, hvor jeg benytter mig af (http://www.rubyonrails.org/ “Ruby on Rails”), begyndte jeg at få følgende fejl.

DEPRECATION WARNING: You’re using the Ruby-based MySQL library that ships with
Rails. This library will be REMOVED FROM RAILS 2.2. Please switch to the
offical mysql gem: `gem install mysql` See
http://www.rubyonrails.org/deprecation for details. (called from mysql_connection at /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:81)

Så var der jo ikke andet at gøre end at køre den kommendo som beskeden foreslog. Det plejer at være dejligt nemt at installer gems. Men nej.

$ sudo gem install mysql

Gav følgende resultat.

Building native extensions. This could take a while…
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.

/opt/local/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lm… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lz… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lsocket… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lnsl… no
checking for mysql_query() in -lmysqlclient… no
*** extconf.rb failed ***

Det undrede jeg mig så lidt over, indtil jeg efter at have søgt lidt på [google](http://www.google.com/ “Google”) fandt nogen med samme problemer.
Det skyldes hovedsaglig at min [MySQL](http://www.mysql.com/ “MySQL Query Analyzer – Improving SQL Query Performance”) er installeret lidt specielt. Nemlig i `/opt/local/lib/mysql5/` og alle mysql-relaterede programmer i min $PATH hedder noget med mysql_*5.
Derfor kunne gem-pakken ikke blive installeres automatisk, og man må hjælpe den lidt på vej, med at fortælle hvor `mysql_config` rigtig ligger, hvilket f.eks. kan findes ved at køre følgende i [iTerm](http://iterm.sourceforge.net/ “iTerm”).

$ locate mysql_config
/opt/local/bin/mysql_config5
/opt/local/lib/mysql5/bin/mysql_config
/opt/local/share/man/man1/mysql_config.1.gz

Herefter kan følgende køres.

$ sudo gem install mysql — –with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config
Building native extensions. This could take a while…
Successfully installed mysql-2.7
1 gem installed

Wuhoo, nu kommer der ingen DEPRECATION WARNING mere :)

Git med ekstern arbejdsmappe

Jeg har aldrig helt fået taget mig sammen til at sætte mig ind i [Git](http://git.or.cz/ “Git – Fast Version Control System”), men i forbindelse med mit bachelor projekt, tænkte jeg at nu skulle det være.

Det første jeg ville have, var at få mine git commit direkte ind i det [projektstyring](http://www.redmine.org/) jeg benytter.

## Lokalt opsætning
Først startede jeg mit repository

$ mkdir projekt
$ cd projekt
$ git init

## Ekstern server
Derefter skulle det være muligt at ‘pushe’ ens rettelser ud via ssh.

Derfor gjorde jeg følgende på serveren:

$ mkdir projekt.git
$ cd projekt.git/
$ git –bare init

## Lokalt igen

Derefter kunne jeg gøre følgende

$ git push user@servername.tld:project.git/ master

Herefter kunne jeg definere stien til .git i projekt styringen.
Det kan være en god ide at opsætte SSH-keys før man benytter denne metode. Så man ikke skal indtaste ens password hele tiden, og derudover et alias til dette commit.
Man behøver selvfølgelig ikke at lave den sidste handling hele tiden, men kun når man mener at man vil publicere det sidste man har lavet.

Rotering af logfiler på et andet drev.

Debian er normalt ikke det jeg roder for meget med, men en gang i mellem bliver man nødt til det. Med den lovgivning vi har i dag, skal vi gemme et år tilbage. Det er sådan set nemt nok at sætte op. Først dog lige hvordan det foregår på FreeBSD.

## På FreeBSD

På FreeBSD sætter man f.eks. newsyslog til at rotere maillog med følgende kommando.

/var/log/maillog 640 365 * @T00 JC

Den rotere hermed hver nat og gemmer 365 dage tilbage.
igennem `/etc/crontab` bliver newsyslog så kørt.

0 * * * * root newsyslog

Man kan dog komme ud fra at alle logfilerne ikke kan ligge på samme disk, og man kan derfor tilføje `-a

` til newsyslog, og hermed definere et sted hvor roterede filer skal gemmes.

0 * * * * root newsyslog -a /var/log/archived-logs

## På Debian
På Debian er det lidt anderledes. I hvert fald for nogen af logfilerne. For det første kan det være sat op i `/etc/logrotate` eller i dens egen fil i `/etc/logrotate.d/`. I det setup jeg arbejdede med sidst, var dette dog ikke tilfældet. Her blev filerne styret i syslogd.
Følgende giver alle de filer som syslogd rotere;

# /usr/sbin/syslogd-listfiles
/var/log/mail.warn
/var/log/daemon.log
/var/log/syslog
/var/log/mail.log

Via `/etc/cron.daily/sysklogd` bliver disse filer så fundet frem og med `/usr/bin/savelog` roteret.
De filer jeg arbejder med bliver gemt på følgende måde.

savelog -g adm -m 640 -u root -c 365 $LOG >/dev/null

Hvis man læser manpages til `savelog` så får man at vide at `-r ` kan benyttes, til at gemme de gamle filer på en anden lokation.
Det fremgår dog ikke, at denne `rolldir` er relativ til den roterede fil og det er derfor ikke muligt at angive en absolut sti.
Dette er blevet added som [en bug](http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg376050.html), men den er i hvert fald ikke rettet på vores system.

Nå, men tilbage til selve opgaven. At flytte gamle logfiler over på et andet drev.
Først link til drevet så jeg får en relativ path.

ln -s /log/servernavn/savelog /var/log/archived-logs

Derefter flytte de filer som defineret i `syslogd-listfiles`

mv /var/log/mail.warn.* /var/log/mail.log.* /var/log/daemon.log.*
/var/log/syslog.* /var/log/archived-logs

Til sidst rette, så savelog også gemmer filerne i denne mappe

# emacs /etc/cron.daily/sysklogd
savelog -g adm -m 640 -u root -c 365 -r archived-logs $LOG >/dev/null

Nu skulle nye roterede filer gemmes på det nye drev, og pladsproblemerne er løst.

PostgreSQL på Macintosh

I forbindelse med [mit firma](http://fairweb.dk/) har jeg brug for at køre en [PostgreSQL](http://www.postgresql.org/) server på min MacBookPro med OS X. Jeg satte mit lid til [MacPorts](http://macports.org), og det gik nogenlunde smertefrit, efter at jeg havde huske at lave nogle “port clean” på et par pakker.
Derefter skulle jeg lave en start database og vælge placering og så starte serveren, men der startede problemerne. Det viste jeg at være nogle kernel-indstillinger som ikke var sat korrekt.
De hed noget med kern.sysv.shmmax, kern.sysv.shmmin, kern.sysv.shmmni, kern.sysv.shmseg og kern.sysv.shmall, og efter at have rette dem til i følge denne guide til [PostgreSQL sammen med rail](http://brilliantcorners.org/node/84), lykkedes det mig endeligt at få det til at virke. Det gav serveren tilladelse til at bruge flere ram på maskinen.

Update:
Efter at skulle installere det på Leopard, så fandt jeg lige [denne guide](https://wiki.systemsx.ch/display/ITDOC/Install+PostgresSQL+on+Mac+OS+X) som bruger Mac Ports og virker fortræffelig.

Linuxforum

Så er dette års [Linuxforum](http://linuxforum.dk/2007/) overstået, og igen i år bragte det en masse nu og god viden.
Følgende ting skal jeg have kigget mere på:

* [Hobbit Monitoring](http://hobbitmon.sourceforge.net/), man skal ikke lade sig snyde af designet, for bag det lidt gammeldags design, ligger der et efiktiv tool, som går det muligt at overvåge mange servere på en nem måde. Faktisk satte jeg det op da jeg kom hjem fra Linuxforum, og på 10 minutter havde jeg sat serveren samt et par klienter til den i mit [firma](http://fairweb.dk/)
* [Dspam](http://www.nuclearelephant.com/). Dette ser ud til at være et udemærket værktøj til bekæmpelse af spam. Jeg har før overvejet at se på det, men har ikke rigtigt haft tid.
* [Soekris net4801](http://www.soekris.com/net4801.htm) købt ved [Cortexsystems](http://www.cortexsystems.dk/) som et messetilbud. En lille smart computer, som kan bruges til firewall, vpn og andre former for netværksbehandling. Det er mening at denne skal sættes op på [mit kollegie](http://lederkollegiet.dk/), så vi kan styre vores forbindelse lidt bedre. F.eks. er vi begyndt at se en del nettv, og nogen gange skal det have lidt højere prioritet end almindelig trafik.

Til sidst skal det nævnes at jeg selvfølgelig igen fik hørt Peter Larsen fra [GratisDNS](http://www.gratisdns.dk/), som altid har nogle munter dagligdags historier at fortælle, når man driver DNS-hosting på et lidt højere plan. Forresten havde han udstillingens bedste slik! (og han var nok også den stand som havde mest af det)

P990i GRPS og SSH

En af de grunde til at jeg købte en P990i, var at jeg skulle kunne ssh til mine firmaservere fra min telefon, og lave ting de som var højst nødvendige, lige meget hvor jeg stod i landet. Desværre har jeg haft så tralvt på det sidste, at jeg slet ikke har fundet tid til at sætte min mobil op.
I aften lykkedes dig mig endelig at finde lidt tid, hvor jeg fik både sat GPRS op samt fundet ud af hvordan jeg kunne SSH til mine servere.

Continue reading