diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index ca26def..0000000 --- a/.drone.yml +++ /dev/null @@ -1,44 +0,0 @@ -kind: pipeline -type: docker -name: default - -steps: - - name: build - image: node:lts - commands: - - npm install - - npm run build - - name: deploy-dev - image: alpine - environment: - FTP_HOST: - from_secret: FTP_HOST - FTP_USERNAME: - from_secret: FTP_USERNAME - FTP_PASSWORD: - from_secret: FTP_PASSWORD - commands: - - which lftp || ( apk --update add lftp ) - - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ dev.samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST - when: - branch: - - develop - event: - - push - - name: deploy - image: alpine - environment: - FTP_HOST: - from_secret: FTP_HOST - FTP_USERNAME: - from_secret: FTP_USERNAME - FTP_PASSWORD: - from_secret: FTP_PASSWORD - commands: - - which lftp || ( apk --update add lftp ) - - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST - when: - branch: - - main - event: - - push diff --git a/.eleventy.js b/.eleventy.js new file mode 100644 index 0000000..972fa38 --- /dev/null +++ b/.eleventy.js @@ -0,0 +1,47 @@ +const eleventySass = require("eleventy-sass"); +const tinyCSS = require('@sardine/eleventy-plugin-tinycss'); +const tinyHTML = require('@sardine/eleventy-plugin-tinyhtml'); +const site = require('./src/_data/site.js'); + +module.exports = function (eleventyConfig) { + eleventyConfig.addPlugin(tinyCSS, { + output: `dist/${site.lang}/` + }); + eleventyConfig.addPlugin(tinyHTML); + eleventyConfig.addPlugin(eleventySass, { + sass: { + loadPaths: ["node_modules"], + style: "compressed", + sourceMap: false, + }, + compileOptions: { + permalink: function (contents, inputPath) { + return (data) => { + return data.page.filePathStem.replace(/^\/scss\//, "/css/") + ".css"; + }; + } + } + }); + + eleventyConfig.setUseGitIgnore(false); + eleventyConfig.addPassthroughCopy({ + "src/img": "img", + "src/font": "font", + "src/favicon.*": "", + }); + + return { + // Pre-process *.html files with: (default: `liquid`) + htmlTemplateEngine: "njk", + // Opt-out of pre-processing global data JSON files: (default: `liquid`) + dataTemplateEngine: "njk", + + dir: { + input: "src", + // includes: "_includes", + // layouts: "_includes/layouts", + data: "_data", + output: `dist/${site.lang}/` + } + }; +}; diff --git a/.woodpecker.yml b/.woodpecker.yml index 0b58258..23310ef 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -4,6 +4,11 @@ pipeline: commands: - npm install - npm run build + build-de: + image: node:lts + commands: + - npm install + - npm run build:de deploy-dev: image: alpine secrets: @@ -12,7 +17,21 @@ pipeline: - FTP_PASSWORD commands: - which lftp || ( apk --update add lftp ) - - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ dev.samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST + - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/en/ dev.samuel-philipp.com/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST + when: + branch: + - develop + event: + - push + deploy-dev-de: + image: alpine + secrets: + - FTP_HOST + - FTP_USERNAME + - FTP_PASSWORD + commands: + - which lftp || ( apk --update add lftp ) + - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/de/ dev.samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST when: branch: - develop @@ -26,7 +45,21 @@ pipeline: - FTP_PASSWORD commands: - which lftp || ( apk --update add lftp ) - - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/ samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST + - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/en/ samuel-philipp.com/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST + when: + branch: + - main + event: + - push + deploy-de: + image: alpine + secrets: + - FTP_HOST + - FTP_USERNAME + - FTP_PASSWORD + commands: + - which lftp || ( apk --update add lftp ) + - lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -R ./dist/de/ samuel-philipp.de/; bye" -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST when: branch: - main diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index dcc353a..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Settings - * Turn on/off build features - */ -var settings = { - clean: true, - scripts: true, - styles: true, - copy: true, - reload: true -}; - - -/** - * Paths to project folders - */ -var paths = { - input: 'src/', - output: 'dist/', - scripts: { - input: 'src/js/*.js', - output: 'dist/js/' - }, - styles: { - input: 'src/scss/*.scss', - output: 'dist/css/' - }, - copy: { - input: [ - 'src/*.html', -// 'src/.htaccess', - 'src/{img,font}/**/*', - 'node_modules/@fortawesome/fontawesome-free/*fonts/**/*' - ], - output: 'dist/' - }, - reload: './dist/' -}; - - -/** - * Template for banner to add to file headers - */ - -var banner = { - main: - '/*!' + - ' <%= package.name %> v<%= package.version %>' + - ' | (c) ' + new Date().getFullYear() + ' <%= package.author.name %>' + - ' | <%= package.license %> License' + - ' | <%= package.repository.url %>' + - ' */\n' -}; - - -/** - * Gulp Packages - */ -// General -var {src, dest, watch, series, parallel} = require('gulp'); -var del = require('del'); -var flatmap = require('gulp-flatmap'); -var lazypipe = require('lazypipe'); -var rename = require('gulp-rename'); -var header = require('gulp-header'); -var package = require('./package.json'); - -// Scripts -var concat = require('gulp-concat'); -var uglify = require('gulp-terser'); -var optimizejs = require('gulp-optimize-js'); - -// Styles -var sass = require('gulp-sass')(require('node-sass')); -var postcss = require('gulp-postcss'); -var prefix = require('autoprefixer'); -var minify = require('cssnano'); -var tildeImporter = require('node-sass-tilde-importer'); - -// BrowserSync -var browserSync = require('browser-sync'); - - -/** - * Gulp Tasks - */ -// Remove pre-existing content from output folders -var cleanDist = function (done) { - - // Make sure this feature is activated before running - if (!settings.clean) return done(); - - // Clean the dist folder - del.sync([ - paths.output - ]); - - // Signal completion - return done(); - -}; - -// Repeated JavaScript tasks -var jsTasks = lazypipe() - .pipe(header, banner.main, {package: package}) - .pipe(optimizejs) - .pipe(dest, paths.scripts.output) - .pipe(rename, {suffix: '.min'}) - .pipe(uglify) - .pipe(optimizejs) - .pipe(header, banner.main, {package: package}) - .pipe(dest, paths.scripts.output); - -// minify, and concatenate scripts -var buildScripts = function (done) { - // Make sure this feature is activated before running - if (!settings.scripts) return done(); - - // Run tasks on script files - return src(paths.scripts.input) - .pipe(flatmap(function(stream, file) { - - // If the file is a directory - if (file.isDirectory()) { - - // Setup a suffix variable - var suffix = ''; - - // If separate polyfill files enabled - if (settings.polyfills) { - - // Update the suffix - suffix = '.polyfills'; - - // Grab files that aren't polyfills, concatenate them, and process them - src([file.path + '/*.js', '!' + file.path + '/*' + paths.scripts.polyfills]) - .pipe(concat(file.relative + '.js')) - .pipe(jsTasks()); - - } - - // Grab all files and concatenate them - // If separate polyfills enabled, this will have .polyfills in the filename - src(file.path + '/*.js') - .pipe(concat(file.relative + suffix + '.js')) - .pipe(jsTasks()); - - return stream; - - } - - // Otherwise, process the file - return stream.pipe(jsTasks()); - - })); - -}; - -// Process, and minify Sass files -var buildStyles = function (done) { - // Make sure this feature is activated before running - if (!settings.styles) return done(); - - // Run tasks on all Sass files - return src(paths.styles.input) - .pipe(sass({ - importer: tildeImporter, - outputStyle: 'expanded', - sourceComments: true - })) - .pipe(postcss([ - prefix({ - cascade: true, - remove: true - }) - ])) - .pipe(header(banner.main, {package: package})) - .pipe(dest(paths.styles.output)) - .pipe(rename({suffix: '.min'})) - .pipe(postcss([ - minify({ - discardComments: { - removeAll: true - } - }) - ])) - .pipe(dest(paths.styles.output)); - -}; - -// Copy static files into output folder -var copyFiles = function (done) { - - // Make sure this feature is activated before running - if (!settings.copy) return done(); - - // Copy static files - return src(paths.copy.input) - .pipe(dest(paths.copy.output)); - -}; - -// Watch for changes to the src directory -var startServer = function (done) { - // Make sure this feature is activated before running - if (!settings.reload) return done(); - - // Initialize BrowserSync - browserSync.init({ - server: { - baseDir: paths.reload - } - }); - - // Signal completion - done(); - -}; - -// Reload the browser when files change -var reloadBrowser = function (done) { - if (!settings.reload) return done(); - browserSync.reload(); - done(); -}; - -// Watch for changes -var watchSource = function (done) { - watch(paths.input, series(exports.default, reloadBrowser)); - done(); -}; - - -/** - * Export Tasks - */ -// Default task -// gulp -exports.default = series( - cleanDist, - parallel( - buildScripts, - buildStyles, - copyFiles - ) -); - -// Watch and reload -// gulp watch -exports.watch = series( - exports.default, - startServer, - watchSource -); diff --git a/package.json b/package.json index 217c0dd..c86d1ab 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,12 @@ { "name": "samuel-philipp.de", "version": "1.0.0", - "description": "website for samuel-philipp.de", + "description": "Website for samuel-philipp.de", "scripts": { - "start": "gulp watch", - "build": "gulp" + "start": "eleventy --serve --watch", + "start:de": "LANGUAGE=de eleventy --serve --watch", + "build": "npm run build:de && npm run build:en", + "build:de": "npm run compile-sass && eleventy && npm run minify-css && node .compress-all.js --lang de" }, "author": "samuel-p", "repository": { @@ -15,25 +17,23 @@ "browser-sync": "^2.27.10" }, "devDependencies": { - "autoprefixer": "10.4.8", - "cssnano": "5.1.13", - "del": "6.1.1", - "gulp": "4.0.2", - "gulp-concat": "2.6.1", - "gulp-flatmap": "1.0.2", - "gulp-header": "2.0.9", - "gulp-optimize-js": "1.1.0", - "gulp-postcss": "9.0.1", - "gulp-rename": "2.0.0", - "gulp-sass": "5.1.0", - "gulp-terser": "2.1.0", - "lazypipe": "1.0.2", - "node-sass": "^7.0.1", + "@11ty/eleventy": "^1.0.2", + "@11ty/eleventy-navigation": "^0.3.5", + "@node-minify/core": "^7.1.0", + "@node-minify/crass": "^7.1.0", + "@node-minify/html-minifier": "^7.1.0", + "@sardine/eleventy-plugin-tinycss": "^2.0.0", + "cpx": "^1.5.0", + "eleventy-sass": "^2.1.6", + "glob": "^8.0.3", + "minify": "^9.1.0", + "node-sass": "^8.0.0", "node-sass-tilde-importer": "^1.0.2", - "postcss": "^8.4.16", - "sass": "^1.54.5" + "postcss": "^8.4.21", + "sass": "^1.57.1" }, "dependencies": { - "bootstrap": "^5.2.0" + "@sardine/eleventy-plugin-tinyhtml": "^0.2.0", + "bootstrap": "^5.2.3" } } diff --git a/src/_data/i18n/de.json b/src/_data/i18n/de.json new file mode 100644 index 0000000..e572d57 --- /dev/null +++ b/src/_data/i18n/de.json @@ -0,0 +1,251 @@ +{ + "about": { + "title": "Über mich", + "overview": { + "name": "Name", + "mail": "E-Mail", + "site": "Webseite", + "url": "samuel-philipp.de", + "address": "Adresse" + }, + "hello": "Willkommen!", + "text": "There live the blind texts far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in bookmarksgrove there live the blind texts far from the countries." + }, + "resume": { + "title": "Mein Lebenslauf", + "work": { + "title": "Berufliche Laufbahn", + "positions": [ + { + "position": "Geschäftsführer", + "company": "Ossrox UG (haftungsbeschränkt)", + "url": "https://ossrox.org", + "start": "März 2022", + "end": "heute", + "descriptions": [ + "Hosting von Open-Source-Tools ossrox.org", + "Strategische Gestaltung des Produktportfolios", + "Direkter Ansprechpartner im technischen Kundensupport", + "Planung und Realisierung individueller Kundenwünsche" + ], + "city": "Magdeburg", + "country": "" + }, + { + "position": "Software Engineer", + "company": "AV-TEST GmbH", + "url": "https://www.av-test.org", + "start": "Jan. 2018", + "end": "heute", + "descriptions": [ + "Threat Intelligence Plattform av-atlas.org", + "Automatisierte Datenschutzanalyse von Android Apps", + "Automatisierte Beschaffung von Malware für weitere Analysesysteme", + "Automatisierte Massenanalyse und Klassifizierung von Spam-Mails" + ], + "city": "Magdeburg", + "country": "" + }, + { + "position": "Software-Entwickler", + "company": "Fiducia & GAD IT AG", + "url": "https://www.fiduciagad.de", + "start": "Okt. 2017", + "end": "Dez. 2017", + "descriptions": [ + "Auditverfahren & Zugriffsverwaltung von produktiven Bankdaten", + "Berufliche Umorientierung wegen Umzug nach Magdeburg" + ], + "city": "Karlsruhe", + "country": "" + }, + { + "position": "Dualer Student Angewandte Informatik", + "company": "Fiducia & GAD IT AG", + "url": "https://www.fiduciagad.de", + "start": "Sept. 2014", + "end": "Sept. 2017", + "descriptions": [ + "Auditschnittstelle für Hadoop-Komponenten eines Fraud-Detection-Systems", + "Entwicklung verschiedener Software-Testverfahren & CI/CD-Abläufe", + "Implementierung diverser Backends & Frontends" + ], + "city": "Karlsruhe", + "country": "" + } + ] + }, + "education": { + "title": "Akademische Laufbahn", + "positions": [ + { + "course": "IT-Sicherheit und Forensik", + "degree": "Master of Engineering", + "institution": "Hochschule Wismar", + "start": "Sept. 2018", + "end": "Juni 2021", + "description": "Berufsbegleitendes Fernstudium", + "city": "Wismar" + }, + { + "course": "Angewandte Informatik", + "degree": "Bachelor of Science", + "institution": "Duale Hochschule Baden-Württemberg", + "start": "Okt. 2014", + "end": "Sept. 2017", + "description": "", + "city": "Karlsruhe" + }, + { + "course": "", + "degree": "Abitur", + "institution": "Albert-Einstein-Schule", + "start": "Sept. 2011", + "end": "Juni 2014", + "description": "Technisches Gymnasium, Profil Informationstechnik", + "city": "Ettlingen" + } + ] + } + }, + "projects": { + "title": "Meine Projekte", + "list": [ + { + "icon": "sp-codes.svg", + "name": "sp-codes", + "description": "In meiner Freizeit stelle ich verschiedene quelloffene Dienste für die freie Nutzung bereit.", + "url": "https://sp-codes.de" + }, + { + "icon": "sp-codes.svg", + "name": "Samuel's Blog", + "description": "Wenn ich Zeit finde schreibe ich gelegentlich den ein oder anderen Artikel für meinen Blog.", + "url": "https://samuels-blog.de" + }, + { + "icon": "op.png", + "name": "Ossrox", + "description": "Mit meiner Firma Ossrox biete ich Hosting von Open-Source-Tools an.", + "url": "https://ossrox.org" + } + ] + }, + "skills": { + "title": "Skills", + "languages": [ + { + "name": "Java", + "percent": 95 + }, + { + "name": "HTML", + "percent": 95 + }, + { + "name": "CSS", + "percent": 90 + }, + { + "name": "SQL", + "percent": 95 + }, + { + "name": "Bash", + "percent": 85 + }, + { + "name": "JavaScript", + "percent": 80 + }, + { + "name": "TypeScript", + "percent": 75 + }, + { + "name": "Python", + "percent": 50 + } + ], + "technologies": [ + { + "name": "Docker", + "percent": 95 + }, + { + "name": "Kubernetes", + "percent": 40 + }, + { + "name": "Elasticsearch", + "percent": 40 + }, + { + "name": "Spring Framework", + "percent": 85 + }, + { + "name": "Git", + "percent": 90 + }, + { + "name": "Angular", + "percent": 80 + }, + { + "name": "Bootstrap", + "percent": 75 + }, + { + "name": "Intellij IDEA", + "percent": 90 + }, + { + "name": "CI/CD", + "percent": 90 + }, + { + "name": "Node.js", + "percent": 80 + } + ] + }, + "interests": { + "title": "Interessen", + "list": [ + { + "image": "", + "name": "Softwerke Magdeburg e.V.", + "description": "Mitglied", + "url": "" + }, + { + "image": "", + "name": "Zauberkunst", + "description": "", + "url": "https://sp-magic.de" + }, + { + "image": "", + "name": "Kraftsport", + "description": "", + "url": "" + }, + { + "image": "", + "name": "Bouldern", + "description": "", + "url": "" + } + ] + }, + "contact": { + "title": "Kontakt" + }, + "footer": { + "imprint": "Impressum", + "privacy": "Datenschutz", + "code": "Code", + "stats": "Statistiken" + } +} diff --git a/src/_data/i18n/en.json b/src/_data/i18n/en.json new file mode 100644 index 0000000..58a8dab --- /dev/null +++ b/src/_data/i18n/en.json @@ -0,0 +1,102 @@ +{ + "about": { + "title": "About Me", + "overview": { + "name": "Name", + "mail": "E-Mail", + "site": "Website", + "url": "samuel-philipp.com", + "address": "Address" + }, + "hello": "Hello There!", + "text": "There live the blind texts far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in bookmarksgrove there live the blind texts far from the countries." + }, + "resume": { + "title": "My Resume", + "work": { + "title": "Work Experience", + "positions": [ + { + "position": "Managing Director", + "company": "Ossrox UG (haftungsbeschränkt)", + "url": "https://ossrox.org", + "start": "März 2022", + "end": "now", + "descriptions": [ + "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts." + ], + "city": "Magdeburg", + "country": "" + }, + { + "position": "Software Engineer", + "company": "AV-TEST GmbH", + "url": "https://www.av-test.org", + "start": "Jan. 2018", + "end": "heute", + "descriptions": [ + "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts." + ], + "city": "Magdeburg", + "country": "" + }, + { + "position": "Software Engineer", + "company": "Fiducia & GAD IT AG", + "url": "https://www.fiduciagad.de", + "start": "Oct. 2017", + "end": "Dec. 2017", + "descriptions": [ + "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts." + ], + "city": "Karlsruhe", + "country": "" + }, + { + "position": "Dual Student Applied Computer Science", + "company": "Fiducia & GAD IT AG", + "url": "https://www.fiduciagad.de", + "start": "Sept. 2014", + "end": "Sept. 2017", + "descriptions": [ + "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts." + ], + "city": "Karlsruhe", + "country": "" + } + ] + }, + "education": { + "title": "Education", + "positions": [ + { + "course": "IT-Sicherheit und Forensik", + "degree": "Master of Engineering", + "institution": "Wismar University", + "start": "Sept. 2018", + "end": "June 2021", + "description": "Berufsbegleitendes Fernstudium", + "city": "Wismar" + }, + { + "course": "Angewandte Informatik", + "degree": "Bachelor of Science", + "institution": "Baden-Württemberg Cooperative State University", + "start": "Oct. 2014", + "end": "Sept. 2017", + "description": "", + "city": "Karlsruhe" + }, + { + "course": "", + "degree": "Abitur (A-Level)", + "institution": "Albert-Einstein School", + "start": "Sept. 2011", + "end": "June 2014", + "description": "Technisches Gymnasium, Profil Informationstechnik", + "city": "Ettlingen" + } + ] + } + } +} diff --git a/src/_data/site.js b/src/_data/site.js new file mode 100644 index 0000000..6832504 --- /dev/null +++ b/src/_data/site.js @@ -0,0 +1,8 @@ +const site = require("./site.json"); + +site.buildTime = new Date(); +site.lang = process.env.LANGUAGE || 'en'; +site.language = site.languages.find(l => l.code === site.lang); +site.strings = require(`./i18n/${site.lang}.json`); + +module.exports = site; diff --git a/src/_data/site.json b/src/_data/site.json new file mode 100644 index 0000000..1ca5f23 --- /dev/null +++ b/src/_data/site.json @@ -0,0 +1,20 @@ +{ + "title": "Samuel Philipp", + "subtitle": "Full-Stack Developer / SysAdmin / Magician", + "description": "Samuel Philipp - Full-Stack Developer / SysAdmin / Magician", + "author": "Samuel Philipp", + "languages": [ + { + "label": "English", + "code": "en", + "icon": "us", + "url": "https://samuel-philipp.com" + }, + { + "label": "Deutsch", + "code": "de", + "icon": "de", + "url": "https://samuel-philipp.de" + } + ] +} diff --git a/src/img/op.png b/src/img/op.png new file mode 100644 index 0000000..9efd32f Binary files /dev/null and b/src/img/op.png differ diff --git a/src/img/samuel-1024.jpg b/src/img/samuel-1024.jpg new file mode 100644 index 0000000..54f1acf Binary files /dev/null and b/src/img/samuel-1024.jpg differ diff --git a/src/img/sp-codes.svg b/src/img/sp-codes.svg new file mode 100644 index 0000000..10d6a99 --- /dev/null +++ b/src/img/sp-codes.svg @@ -0,0 +1 @@ + diff --git a/src/index.html b/src/index.html index 08900cc..c417cb6 100644 --- a/src/index.html +++ b/src/index.html @@ -1,7 +1,10 @@ +--- +title: {{site.title}} +--- - Samuel Philipp + {{site.title}} @@ -13,24 +16,24 @@ - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + @@ -41,10 +44,10 @@
- -

Samuel Philipp

-

Full-Stack Developer / SysAdmin / Magician

-