diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 007325db148c0aa03f80bdbf26b9c20367536094..2338ff3eb4bd39da49449f1fd919b931145d41af 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ image: docker:20.10.9
 
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
-  IMAGE_VER: 0.4.0
+  IMAGE_VER: 0.5.0
 
 services:
   - docker:20.10.9-dind
diff --git a/Dockerfile b/Dockerfile
index a45e8d633f24b0a13b485da014d308743b8bdd65..66885ddc2e35534be583c9470e8ec0e27b880e86 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,15 +6,18 @@ RUN apt-get update && apt-get install -y \
     build-essential \
     libcrypt-openssl-rsa-perl \
     libdigest-sha-perl \
+    libdbd-pg-perl \
+    libdbi-perl \
+    libdbix-class-perl \
     libmodule-build-tiny-perl \
     libio-socket-ssl-perl \
+    libjson-perl \
     libyaml-perl \
     libyaml-dev
 
-#    libnet-ssleay-perl \
-
 RUN cpanm \
     Mojolicious \
+    Mojo::Pg \
     Mojo::Redis \
     Mojo::JWT \
     Mojolicious::Plugin::OpenAPI
diff --git a/cf2022.conf b/cf2022.conf
index 8efcf4e24db5479712cfb43c5d327cb738b2a42e..2999e3f9be2e0b4af55ce6ae1c439ab7f875e30f 100644
--- a/cf2022.conf
+++ b/cf2022.conf
@@ -4,6 +4,7 @@
   groups_url            => 'https://iapi.pirati.cz/v1/groups',
   pretix_api            => 'https://pretix.pir-test.eu/api/v1',
   pretix_token          => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
+  pretix_testmode       => 1,
   pretix_organizer      => 'pirati',
   pretix_event          => 'cf2022',
   pretix_qid_sso        => 29, # identifikator otazky SSO UID
diff --git a/lib/CF2022.pm b/lib/CF2022.pm
index 0c8e7b62d7fab1bb396d5f28578df9d998de117d..9f0924b939756604fecb1ac1c666d7f64cedba92 100644
--- a/lib/CF2022.pm
+++ b/lib/CF2022.pm
@@ -1,6 +1,8 @@
 package CF2022;
 use Mojo::Base 'Mojolicious';
+use Mojo::Pg;
 use Mojo::Redis;
+use CF2022::Schema;
 
 # This method will run once at server start
 sub startup {
@@ -21,6 +23,35 @@ sub startup {
 #    my $redis = Mojo::Redis->new( $cfg->{redis} );
 #    $self->helper( redis => sub { return $redis; } );
 
+    # migrace schematu
+    my $pg = Mojo::Pg->new
+        ->dsn($cfg->{db_dsn})
+        ->username($cfg->{db_username})
+        ->password($cfg->{db_password})
+    ;
+    if ($cfg->{test}) {
+        $pg->search_path(['test']);
+        $pg->db->query('drop schema if exists test cascade');
+        $pg->db->query('create schema test');
+    }
+    $pg->migrations->from_dir($self->home . '/sql');
+    $pg->migrations->migrate();
+    $self->helper( pg => sub { return $pg; } );
+
+    # DB Schema
+    my $schema = CF2022::Schema->connect({
+        dsn      => $cfg->{db_dsn},
+        user     => $cfg->{db_username},
+        password => $cfg->{db_password},
+    });
+
+    if ( $cfg->{test} ) {
+        $schema->storage->dbh->do("set search_path to test") ;
+    }
+
+    $self->helper( schema => sub { return $schema; } );
+
+    $self->helper( schema => sub { return $schema; } );
     $self->plugin('CF2022::Helpers::Core');
     $self->plugin('CF2022::Helpers::Auth');
 
diff --git a/lib/CF2022/Schema.pm b/lib/CF2022/Schema.pm
new file mode 100644
index 0000000000000000000000000000000000000000..633f4c2a0e88128bff01a21aaaf33c14e73c3924
--- /dev/null
+++ b/lib/CF2022/Schema.pm
@@ -0,0 +1,14 @@
+package CF2022::Schema;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Schema';
+
+our $VERSION = 1;
+
+__PACKAGE__->load_namespaces;
+
+1;
+
+
diff --git a/lib/CF2022/Schema/Result/Order.pm b/lib/CF2022/Schema/Result/Order.pm
new file mode 100644
index 0000000000000000000000000000000000000000..7297438c7c9aa4791247c42f658ff0cf9a9808cd
--- /dev/null
+++ b/lib/CF2022/Schema/Result/Order.pm
@@ -0,0 +1,46 @@
+package CF2022::Schema::Result::Order;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+use JSON;
+
+our $VERSION = 1;
+
+__PACKAGE__->table('orders');
+
+__PACKAGE__->add_columns(
+    qw(
+        id
+        created
+        ip
+        sso_uuid
+        email
+        api
+        request
+        response
+    ),
+);
+
+__PACKAGE__->set_primary_key('id');
+
+__PACKAGE__->inflate_column('request', {
+    inflate => sub {
+        return from_json(shift);
+    },
+    deflate => sub {
+        return to_json(shift);
+    },
+});
+
+__PACKAGE__->inflate_column('response', {
+    inflate => sub {
+        return from_json(shift);
+    },
+    deflate => sub {
+        return to_json(shift);
+    },
+});
+
+1;
diff --git a/sql/1/up.sql b/sql/1/up.sql
new file mode 100644
index 0000000000000000000000000000000000000000..77abbe0c043c3688b3707fb5c3fd0a3a64137824
--- /dev/null
+++ b/sql/1/up.sql
@@ -0,0 +1,13 @@
+create sequence "uid_seq" start 100000;
+
+create table "orders" (
+    "id" integer not null default nextval('uid_seq'),
+    "created" timestamp(0) not null default now(),
+    "ip" inet  not null,
+    "sso_uuid" varchar(36),
+    "email" text not null,
+    "api" text not null,
+    "request" text,
+    "response" text,
+    primary key("id")
+);